mod-rewrite 重定向但阻止直接访问

2023-11-29

我想将所有内容重定向到:

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(使用前将#替换为@)

mod-rewrite 重定向但阻止直接访问 的相关文章

随机推荐