有一个文件foo.php,位于/ hello / bar。
因此,如果用户说
/hello/bar/foo.php # Access forbidden
/hello/bar/foo # Redirect to foo.php
到目前为止,我所做的就是/
中的.htaccess,
RewriteEngine on
RewriteRule "^hello/bar/foo$" "hello/bar/foo.php" [L]
RewriteRule "^hello/bar/foo.php$" "-" [F]
但这似乎不起作用。放两个URL,服务器发送403错误。我怎么能纠正这个?
答案 0 :(得分:2)
一旦应用了一组重写规则,结果就会被传回URI解析器,如果URI改变了,它将重新调用重写规则集(在同一个.htaccess或不同的一个,取决于新的URI)。
这意味着,您使用的[L]
标志并未完全停止重写处理,它只是停止通过规则集处理当前周期。
因此,在.htaccess中,第一条规则将hello/bar/foo
重写为hello/bar/foo.php
,[L]
结束当前的重写。 URI解析器认为URI已更改,将从顶部再次重新调用重写。第一条规则将不适用于此次,但第二条规则会导致禁止(又称HTTP 403 - 禁止)。
所以,你需要一种方法来阻止这种循环。在Apache的更高版本中,您可以使用[end]
标志而不是[L]
。这将完全重写所有重写。
RewriteEngine on
RewriteRule "^hello/bar/foo$" "hello/bar/foo.php" [END]
RewriteRule "^hello/bar/foo.php$" "-" [F]
请参阅https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_end