Apache重写规则,重写参数以获取脚本的vars,拒绝访问脚本

时间:2012-05-21 21:13:41

标签: php apache

我正在尝试获取重写规则来获取一些参数并将它们转换为获取变量然后将它们传递给脚本。

所以我的.htaccess中有以下内容,它有效:

RewriteEngine on

RewriteBase /cms/

RewriteRule ^services$  list.php?type=services  [L]

然后,我想添加另一条停止直接访问脚本的规则 list.php。所以我添加了以下内容:

RewriteRule ^list.php   -    [F,NS]

每当我尝试访问以下网址时出于某种原因,只会给我一个“禁止”错误:

/cms/services

我认为如果请求不是内部子请求,那么标志会阻止它被访问,但它似乎完全阻止我访问脚本。

谁能告诉我这里哪里出错了?我一直试图让自己的头脑在这里好几天。 .htaccess文件位于一个目录中,该目录可以通过vhost中的Alias访问,但我知道我的htaccess正在读取,因为当我删除第二个规则时,第一个规则按预期工作。

2 个答案:

答案 0 :(得分:2)

你对子请求问题是正确的。 [NS]标志应阻止此规则应用于内部子请求。我不知道为什么'它没有按预期工作(因为你在.htaccess而不是在Directory部分?因为mod_alias?)。 无论如何,您可以尝试使用替换方法来测试 REDIRECT_STATUS 环境变量,该变量被证明比标志更可靠。

让我们尝试一下(未测试),我更喜欢使用长名称版本的标志,我认为mod_rewrite已经足够混淆了。另请注意,规则顺序 NOT 很重要。即使使用[last]标记,规则的结果也会重新应用于rulset。:

RewriteEngine on
RewriteBase /cms/

# RULE 1
# This rule will apply only from  a direct user access.
# If any other rewrite made an internal redirect we'll skeeze that rule
# so if access is provided after an internal redirect it's ok
# we catch it via the env variable REDIRECT_STATUS which must be empty
RewriteCond %{ENV:REDIRECT_STATUS} ^$  
# 403 FORBIDDEN if the user request direclty list.php!
RewriteRule ^list.php - [forbidden,last]

# RULE 2
# any request to service is in fact internally
# redirected to list.php?type=services
RewriteRule ^services$  list.php?type=services  [nocase, last]

答案 1 :(得分:1)

您应该尝试这样做以防止访问特定文件:

<files list.php>
order allow,deny
deny from all
</files>

现在,任何访问list.php文件的尝试都将导致403错误消息。同样,您可以阻止访问您的htaccess文件。