.htaccess RewriteCond %{REQUEST_URI}匹配以开头但不以某个多个子字符串结尾的URL

vsdwdz23  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一个这样的网址列表。

/wp-content/uploads/2023/01/Hambu-logo.png
/wp-content/uploads/2023/01/Anesa-logo.png
/wp-content/uploads/2023/01/Rock-logo.png
/wp-content/uploads/2023/01/Blue-logo.png

使用RewriteCond %{REQUEST_URI},当%{REQUEST_URI}以**/wp-content/uploads/开头并且不以以下两个字符串之一结尾时,我希望重写到另一个网站Hambu-logo.pngAnesa-logo.png**
我试过很多不同的表达方式,但都不管用。我在消极前瞻方面做错了什么?

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-content/uploads/.*(?!(Hambu-logo.png|Anesa-logo.png))$
RewriteRule ^wp-content/uploads(.*)$ https://www.test.com/wp-content/uploads$1 [R=302,L]
bq8i3lrv

bq8i3lrv1#

RewriteCond %{REQUEST_URI} ^/wp-content/uploads/.*(?!(Hambu-logo.png|Anesa-logo.png))$
RewriteRule ^wp-content/uploads(.*)$ https://www.test.com/wp-content/uploads$1 [R=302,L]

负前瞻之前的.*消耗字符串的其余部分,负前瞻 * Assert * 总是失败。
您可以改为使用负向后看:

^/wp-content/uploads/.*(?<!(Hambu|Anesa)-logo\.png)$

但是,这可以简化,不需要否定的 lookaround,只需在 condition 中使用求反表达式(mod_rewrite语法),不需要同时匹配RewriteRulepatterncondition 中的URL前缀。
例如,在根.htaccess文件中:

RewriteCond %{REQUEST_URI} !/(Hambu|Anesa)-logo\.png$
RewriteRule ^wp-content/uploads/ https://www.test.com%{REQUEST_URI} [R=302,L]

以上匹配以/wp-content/uploads/开头但不以/Hambu-logo.png/Anesa-logo.png结尾的所有URL。CondPattern 上的!前缀对表达式求反,因此在不匹配时成功。
由于要重定向到目标上的同一URL路径,因此可以只使用REQUEST_URI服务器变量,而避免RewriteRulepattern 中的捕获子模式。
或者,在/wp-content/uploads子目录中创建另一个.htaccess文件,可以进一步简化规则(不需要RewriteCond指令):

RewriteRule !(^|/)(Hambu|Anesa)-logo\.png$ https://www.test.com%{REQUEST_URI} [R=302,L]

相关问题