Apache的情况下,单个规则不敏感的mod_rewrite

我正在使用mod_rewritesearch引擎友好的url。 我有这个很好的作品:

RewriteRule ^Pay ./pay.php [L] #Pay 

但是如果访问者inputhttp://example.com/pay (注意小写),我也想要匹配。 我曾尝试使用NC但我得到一个500错误。 我已经尝试了2个单独的规则一个大写和一个小写,但再次500错误。

这可以使用正则expression式在一行上完成吗? 就像是:

 RewriteRule ^([Pp])ay ./pay.php [L] #Pay 

如果是这样,什么是正确的方法? 如果不是我怎么能不使用mod_spelling来完成这个?

 RewriteRule ^Pay ./pay.php [L] #Pay 

由于无尽的重写循环,你会得到一个500错误。 如果你只是使上面的大小写不敏感,那么重写的URL即。 /pay.php匹配现在不区分大小写的模式^Pay等。

在这种情况下,您可以简单地使您的模式更具限制性,只需匹配“支付”,而不是任何简单地开始 “支付”的URLpath。 例如:

 # Pay RewriteRule ^pay$ pay.php [NC,L] 

我也删除了./前缀,这不是必需的。 另外,Apache不支持行结束注释。

但请注意,在使这种重写不区分大小写的情况下,可能会导致重复的内容

我不知道一个简单的不区分大小写的重写规则,但是你匹配P或p的尝试是非常接近正确的。 只要省略了短划线和括号就行了。 这是我为你testing的(尽可能简单):

 RewriteRule ^/[Pp]ay /pay.php 

所以方括号内的字符只是1个字符的替代字符

 RewriteRule ^[Pp][Aa][yY] /pay.php 

将匹配任何小写和大写的组合。 我不确定,为什么你的版本不起作用,因为它意味着“匹配P和P之间的任何字符”,这应该是P,Q,R,… Z,某些punktuation,a,b ,C …页。 我没有testing过你的版本。

括号()不应该造成任何伤害,他们只是意味着“提取你在那里find的任何东西,并使其可以在'replacestring'中作为'$ 1'访问。

build议:尝试使用静态文件。 用一些虚拟内容(例如“this is test.html”)创buildtest.html,尝试使用浏览器通过正在testing的Web服务器访问它。 然后添加一个规则

 rewriterule ^/best.html$ /test.html 

并访问best.html – 你应该看到test.html。 继续改变你的重写规则的一小部分,直到find出错的部分。