带有两个子文件夹的.htaccess(基岩在它的根目录下的self目录下)

afdcj2ne  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(183)

在我的本地服务器的webroot中,我尝试在它的self目录中安装Bedrock:

|- htdocs
   |- bedrock
      |- web

使用我编写的.htaccess文件,我可以访问web目录,从而启动我的应用程序:

RewriteEngine On
    
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]

RewriteCond %{HTTP_HOST} ^(www.)?example.local$
RewriteCond %{REQUEST_URI} !^/bedrock/web/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /bedrock/web/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.local$
RewriteRule ^(/)?$ bedrock/web/index.php [L]

但是,我希望避免使用以下URL访问基岩目录:example.local/bedrock .
我可以用Apache的rewrite模块来实现这个功能吗?或者我必须在基岩目录中添加一个带有deny from all的.htaccess?

kiayqfof

kiayqfof1#

您可以阻止对/bedrock子目录的直接访问,但仍然允许在内部将请求重写到该目录,方法是在现有规则 * 之前 * 添加以下内容:

# Block "direct" access to the "/bedrock" subdirectory
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^bedrock($|/) - [F]

如果客户端直接请求/bedrock/bedrock/<anything>,则上述代码将返回“403 Forbidden”。
通过检查REDIRECT_STATUS环境变量是否为 empty,我们可以确保该规则仅应用于直接请求(而不是重写请求-在文件的后面)。
REDIRECT_STATUS env在初始请求时为空,但在第一次成功重写后设置为200(如在200 OK状态中)。
...还是我必须在基岩目录中添加一个.htaccess并拒绝来自所有的访问?
这将阻止 * 所有 * 请求,包括您的内部重写。

  • 旁白 *
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]

RewriteCond %{HTTP_HOST} ^(www.)?example.local$
RewriteCond %{REQUEST_URI} !^/bedrock/web/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /bedrock/web/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.local$
RewriteRule ^(/)?$ bedrock/web/index.php [L]

您应该在前两个规则中包含L标志。您只在最后一个规则中包含了L标志(此处并不严格要求)。
在最后一个规则中不需要捕获组。^/?$(或者甚至.htaccess中的^$)就足够了。

相关问题