Apache mod_rewrite正则表达式限制匹配的最大量词?

3
我在mod_rewrite正则表达式中使用了匹配量词 {},如果量词匹配1或2次,则重写规则有效,如果匹配3次或更多次,则无效。为什么?
示例 .htaccess 文件:
这个有效(我需要 mydomain.com/download.ex):
RewriteEngine On
RewriteRule ^download\..{1,2}$ /download.php [L]

但这并不起作用,出现500错误,只更改了2到3最大量词(我需要mydomain.com/download.exe):

RewriteEngine On
RewriteRule ^download\..{1,3}$ /download.php [L]

这很棒,但是这是真的吗?为什么会这样呢?

p.s. 版本:

root@andrey:/var/www/default/www# apache2 -v
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Jul 22 2014 14:36:38

root@andrey:/var/www/default/www# uname -a
Linux mydomain.com 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64          x86_64 GNU/Linux

root@andrey:/var/www/default/www# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty  
1个回答

0

正则表达式\.{1,3}工作得很好,但它不起作用,因为它也匹配了/download.php,导致mod_rewrite无限循环,从而导致500错误。

为了克服这个问题,在扩展名为.php时使用负向先行断言来停止重写:

RewriteEngine On
RewriteBase /

RewriteRule ^download\.(?!php$).{1,3}$ download.php [L,NC]

如果这是由于无限循环引起的,为什么第一个变量({1,2})能正常工作? - Andrey
因为\.{1,2}只有在范围大于等于3时才会匹配.php,所以你测试过这个解决方案了吗? - anubhava
1
非常感谢,我明白了问题,那么只需将download.php重命名为_download.php即可。RewriteRule ^download\..{1,3}$ /_download.php [L] - Andrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接