.htaccess重写规则中断值的变化

时间:2017-01-31 21:33:07

标签: .htaccess

我的.htaccess文件中有以下规则,它运行正常

RewriteRule ^eat/?([a-zA-Z0-9-]+)?/?([a-zA-Z0-9-]+)?/?([0-9]+)?/?([a-zA-Z0-9-]+)?/?$ /incl/pages/details.php?state=$1&city=$2&ID=$3&name=$4 [NC,L]

我需要修改规则,其中ID($ 3)将是3个字符的字母数字(始终以大写字母)值,而不是现在的3位数。

我已经尝试但我的规则停止了工作:

RewriteRule ^eat/?([a-zA-Z0-9-]+)?/?([a-zA-Z0-9-]+)?/?([A-Z0-9]+)?/?([a-zA-Z0-9-]+)?/?$ /incl/pages/details.php?state=$1&city=$2&ID=$3&name=$4 [NC,L]

我错过了什么?

1 个答案:

答案 0 :(得分:0)

对我来说,这看起来像是一个明确分离参数的问题。如果捕获组匹配相同的字符集,则可能会出现使用问号运算符实现能够重写可变数量参数的“惰性”规则的方式。

相反,我建议您为固定数量的参数指定单独的规则。这允许不使用该运算符:

RewriteEngine on
RewriteRule ^eat/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([A-Z0-9]+)/([a-zA-Z0-9-]+)/?$ /incl/pages/details.php?state=$1&city=$2&ID=$3&name=$4 [NC,L]
RewriteRule ^eat/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([A-Z0-9]+)/?$ /incl/pages/details.php?state=$1&city=$2&ID=$3 [NC,L]
RewriteRule ^eat/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/?$ /incl/pages/details.php?state=$1&city=$2 [NC,L]
RewriteRule ^eat/([a-zA-Z0-9-]+)/?$ /incl/pages/details.php?state=$1 [NC,L]
RewriteRule ^eat/?$ /incl/pages/details.php [NC,L]

还有一个问题:你真的需要NC旗帜吗? eat真的写的是不同的情况吗?因为它会干扰您尝试在仅捕获大写字母或大写和/或小写字母的组之间进行区分。

一般提示:您应该始终更喜欢将此类规则放在http服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。