【问题标题】:RewriteCond validates always to falseRewriteCond 始终验证为 false
【发布时间】:2011-05-01 06:07:05
【问题描述】:

我的 RewriteRule 中有一个正则表达式,目前工作正常。其次,我想测试文件(请求被重写的地方)是否存在。因此,我在我的规则之前放置了一个 RewriteCond,但不幸的是,它始终验证为 false。

这是我的正则表达式:

assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})

我创建了这个 .htaccess:

RewriteCond assets/img$1/.$2.$4/$3.$4 -s
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC,L,QSA]
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&key=$3&ext=$4 [NC,L,QSA]

没有 RewriteCond 的请求(存在重写位置)正常工作。对于那些感兴趣的人,我的完整 .htaccess 发布在这里:http://pastie.org/1293667

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    问题在于RewriteCond 仅适用于紧随其后的规则,因此您的第二个RewriteRule 始终运行。一种解决方案is to negate the test you are making, then have the next command skip the two commands you want to run

    RewriteCond %{DOCUMENT_ROOT}assets/img$1/.$2.$4/$3.$4 !-f
    RewriteRule . - [S=2]
    RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC,QSA]
    RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&key=$3 [NC,L,QSA]
    

    【讨论】:

    • 在 Jurian 的第一个 RewriteRule 中添加一个跳过标志(跳过 1 条规则)就足够了,假设我正确理解了他的意图。
    • 感谢您的回答,这真的很有帮助!不幸的是,我现在注意到第一条规则(重写到图像的另一个位置)根本不起作用(例如,当条件和第二条规则被删除时)。不过,直接请求(请参阅问题)可以正常工作。除了跳过标志之外还有更多错误?
    • 好的,我发现了您的规则不起作用的原因。我使用了 mod_vhost_alias,因此 DOCUMENT_ROOT 没有更改为正确的值。有一个关于此的错误:issues.apache.org/bugzilla/show_bug.cgi?id=26052。无论如何,你的答案最终是正确的。
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多