【问题标题】:Apache mod_rewrite regex limit match max quantifier?Apache mod_rewrite 正则表达式限制匹配最大量词?
【发布时间】:2015-01-10 02:06:57
【问题描述】:

我在 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]

这太棒了,但它是真实的。为什么会这样?

附言 版本:

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  

【问题讨论】:

    标签: regex .htaccess mod-rewrite pcre quantifiers


    【解决方案1】:

    正则表达式 \.{1,3} 工作正常,但无法正常工作,因为它也匹配 /download.php 并导致 mod_rewrite 无限循环,从而导致 500 错误。

    为了克服这个问题,当扩展名是 .php 时,有一个负面的前瞻性来停止重写:

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

    【讨论】:

    • 如果这是因为无限循环,为什么第一个变体 ({1,2}) 工作正常?
    • 因为 \.{1,2} 不会匹配 .php 只有当你给范围 >= 3 它将匹配 .php。您是否测试过解决方案?
    • 非常感谢,我明白了这个问题,那么重命名download.php _download.php RewriteRule ^download\..{1,3}$ /_download.php [L] 会更容易
    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多