1

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

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

RewriteEngine on

RewriteBase /cms/

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

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

RewriteRule ^list.php   -    [F,NS]

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

/cms/services

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

谁能告诉我这里哪里出错了。几天来,我一直在努力解决这个问题。.htaccess 文件位于通过虚拟主机中的别名访问的目录中,但我知道我的 htaccess 正在被读取,因为当我删除第二条规则时,第一个规则按预期工作。

4

2 回答 2

2

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

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

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]
于 2012-05-22T08:17:10.577 回答
1

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

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

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

于 2012-05-22T07:55:02.553 回答