Apache 不区分大小写的 mod_rewrite 单一规则

Apache 不区分大小写的 mod_rewrite 单一规则

我使用 mod_rewrite 来获得搜索引擎友好的 URL。下面这行代码效果很好:

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

http://example.com/pay但如果访问者输入(请注意小写),我也希望匹配。我尝试过使用NC,但出现了 500 错误。我尝试过制定 2 条单独的规则,一条大写,一条小写,但再次出现 500 错误。

能用正则表达式在一行中完成这个吗?例如:

RewriteRule ^([P-p])ay ./pay.php [L] #Pay

如果是,那么正确的方法是什么?如果不是,如何在不使用 mod_spelling 的情况下实现此目的?

答案1

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

由于无限重写循环,您会收到 500 错误。如果您只是将上述内容设置为不区分大小写,则重写的 URL 即/pay.php匹配现在不区分大小写图案^Pay等等等等

在这种情况下,你可以简单地使你的模式更加严格,只匹配“pay”,而不是任何简单的 URL 路径,开始“支付”。例如:

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

我还删除了./替代,这不是必需的。另外,Apache 不支持行尾注释。

但请注意,如果重写时不区分大小写,则可能会导致重复内容

答案2

我不知道简单的不区分大小写的重写规则,但您尝试匹配 P 或 p 非常接近正确。只需省略破折号和括号 - 就可以了。这是我为您测试的(尽可能简单):

RewriteRule ^/[Pp]ay /pay.php

方括号内的字符只是 1 个字符的替代字符,因此

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

会匹配任意大小写组合。不过,我不确定为什么你的版本不起作用,因为它的意思是“匹配 P 和 p 之间的任意字符”,应该是 P、Q、R、...Z、some-punktuation、a、b、c...p。我还没有测试过你的版本。

括号 () 不会造成任何伤害,它们只是意味着“提取在那里找到的任何内容并使其可作为替换字符串中的‘$1’访问”。

建议:尝试使用静态文件。创建包含一些虚拟内容的 test.html(例如“这是 test.html”),尝试通过您正在测试的 Web 服务器使用浏览器访问它。然后添加规则

rewriterule ^/best.html$ /test.html

然后访问 best.html - 您应该会看到 test.html。继续更改重写规则的一小部分,直到找到出错的部分。

相关内容