使用RewriteCond匹配URL:开头符合且排除指定结尾字符串的规则问题
Apache RewriteCond 负向预查错误分析与修复
需求说明
现有一批URL:
/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
需要实现:当请求URI以/wp-content/uploads/开头,且不以Hambu-logo.png或Anesa-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]
错误原因
你写的负向预查位置逻辑错误:.*(?!...)的写法会让正则先匹配任意字符到末尾前的某个位置,再检查后续内容,这导致负向预查根本没作用在URI的结尾位置,自然无法筛选出符合要求的URL。
修复后的规则
写法一(双条件更直观)
RewriteEngine On RewriteCond %{REQUEST_URI} ^/wp-content/uploads/ RewriteCond %{REQUEST_URI} !/(Hambu-logo.png|Anesa-logo.png)$ RewriteRule ^wp-content/uploads(.*)$ https://www.test.com/wp-content/uploads$1 [R=302,L]
写法二(单条件结合负向预查)
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]
规则解释
- 双条件写法:
- 第一个条件确保URI以
/wp-content/uploads/开头 - 第二个条件用
!取反,限制URI不能以/Hambu-logo.png或/Anesa-logo.png结尾(注意路径中的/,保证匹配的是完整文件名结尾)
- 第一个条件确保URI以
- 单条件写法:
^/wp-content/uploads/(?!.*(Hambu-logo.png|Anesa-logo.png)$).*$表示:以/wp-content/uploads/开头,且整个URI的结尾不是指定的两个文件名,精准匹配需要重定向的请求。
两种写法都能正确区分:Rock-logo.png和Blue-logo.png会被重定向,Hambu-logo.png和Anesa-logo.png则保持原请求。
内容的提问来源于stack exchange,提问作者Giacomo Scarpino
相关产品推荐
相关产品推荐

