阻止直接访问网址

时间:2015-12-29 18:28:28

标签: php apache .htaccess mod-rewrite

有一个文件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错误。我怎么能纠正这个?

1 个答案:

答案 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