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

Php Apache重写规则,重写参数以获取脚本的变量,拒绝对脚本的访问,php,apache,Php,Apache,我试图获得一个重写规则,以获取一些参数,并将它们转换为变量,然后将它们传递给脚本 因此,我的.htaccess中有以下内容,它是有效的: RewriteEngine on RewriteBase /cms/ RewriteRule ^services$ list.php?type=services [L] 然后,我想添加另一条规则,停止对脚本的直接访问。因此,我添加了以下内容: RewriteRule ^list.php - [F,NS] 出于某种原因,每当我尝试访问url

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

因此,我的.htaccess中有以下内容,它是有效的:

RewriteEngine on

RewriteBase /cms/

RewriteRule ^services$  list.php?type=services  [L]
然后,我想添加另一条规则,停止对脚本的直接访问。因此,我添加了以下内容:

RewriteRule ^list.php   -    [F,NS]
出于某种原因,每当我尝试访问url时,就会出现一个“禁止的”错误,例如:

/cms/services
我假设,如果请求不是内部子请求,那么这些标志将阻止访问该脚本,但它似乎完全阻止我访问脚本


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

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

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

命令允许,拒绝
全盘否定

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

关于子请求问题,您是对的。
[NS]
标志应防止将此规则应用于内部子请求。我不知道为什么它不能按预期工作(因为你在.htaccess中,而不是目录部分?因为mod_别名?)。 无论如何,您可以尝试使用替换方法,即测试REDIRECT\u STATUS环境变量,这被证明比throus标志更可靠

让我们试试(未测试),我更喜欢使用长名称版本作为标志,我认为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]

如果您不信任[L]标志并将[F]规则放在第一位,它会起作用吗?不,我尝试将其更改为:RewriteEngine on RewriteBase/cms/RewriteRule^list.php-[F,NS]RewriteRule^services$list.php?type=services[L]我稍后会尝试。我现在正在工作。谢谢你的帮助。谢谢你的建议。我回家后会试试这个。我已经开始考虑使用RewriteCond做同样的事情,但我决心弄清楚为什么NS标志似乎什么也没做。我在工作中测试过这个(我不应该,但这确实让我感到困扰),它似乎工作得很好。我只需要添加一个catchall,将所有不是index.php文件的东西重定向到index.php。非常感谢你的帮助。今晚我会睡得更好:)我想这里的问题可能与.htaccess文件中的规则有关,就像我将这些规则放在vhost(Include文件)中一样。即使我将其改回使用NS标志,而不是像您建议的那样重写COND,它们似乎也能工作。因此,我想我需要研究一下原因。如果您有权访问vhost,请完全忘记.htaccess文件,appart会减慢apache的速度并添加一些问题,但这些问题对您没有帮助。在vhost中的
上添加一个
AllowOverride None