我想将所有内容重定向到:
www.example.com/public/...
但阻止直接访问
www.example.com/public/file1/
www.example.com/public/file2/
etc
最终的 URL 应该是:
www.example.com/file1/
我已经尝试过这个重定向并且它有效 - 但我不知道如何防止直接访问:
ReWriteCond %{REQUEST_URI} !/public/
RewriteRule ^(.*) public/$1 [L]
在花费了大量的时间尝试解决这个问题之后,我发现解决方案在于记录不足的REDIRECT_STATUS环境变量.
将其添加到顶层的开头/.htaccess
代码,以及任何.htaccess
您在其下的文件(例如/public/.htaccess
):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteRule ^ /public%{REQUEST_URI} [L]
</IfModule>
现在,如果用户请求example.com/file1
然后他们将收到文件/public/file1
。但是,如果他们要求example.com/public/file1
直接然后服务器将尝试在以下位置提供文件/public/public/file1
,这将会失败(除非您碰巧在该位置有一个文件)。
重要的:
您需要将这些行添加到所有.htaccess
文件,而不仅仅是 Web 根目录中的顶级文件,因为如果您有任何.htaccess
网络根目录下的文件(例如/public/.htaccess
) then 这些将覆盖顶层.htaccess用户将能够再次访问其中的文件/public
直接地。
关于变量和重定向的注意事项:
执行重定向(或重写)导致整个过程使用新的 URI 重新开始,因此您在重定向之前设置的任何变量在重定向之后都将不再设置。这是故意这样做的,因为通常您不希望最终结果取决于您到达那里的方式(即是通过直接请求还是通过重定向)。
然而,对于那些您需要的特殊场合do想知道你如何到达特定的 URI,你可以使用REDIRECT_STATUS
。此外,在重定向之前设置的任何环境变量(例如,SetEnvIf) 重定向后仍然可用,但是with REDIRECT_变量名称的前缀 (so MY_VAR
变成REDIRECT_MY_VAR
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)