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


Apache rewrite rule, rewrite parameters to get vars for script, deny access to script

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

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

RewriteEngine on
RewriteBase /cms/
RewriteRule ^services$  list.php?type=services  [L]

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

RewriteRule ^list.php   -    [F,NS]

出于某种原因,每当我尝试访问 url 时,这只会给我一个">禁止"错误,例如:

/cms/services
我假设如果请求

不是内部子请求,标志会阻止它可访问,但它似乎只是阻止我访问脚本。

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

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

让我们尝试一下(未测试(,我更喜欢使用长名称版本作为标志,我认为mod_rewrite已经足够模糊了。另请注意,规则顺序并不重要。即使使用 [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]

您应该尝试这样做来阻止对特定文件的访问:

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

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