mod_rewrite正则表达式仅在某个字符串不存在时才匹配

nic*_*ckf 7 regex apache mod-rewrite

通过我的服务器日志看,我看到了很多我的网站上的网页请求favicon.ico,favicon.jpg,favicon.png,等在各种不同的目录中.

我没有浏览每个页面以试图找出每个不正确的请求来自何处,而是编写了一些apache重定向规则来更改任何包含"favicon"重定向到的URL的请求/favicon.ico

我最初的天真尝试是这样的:

RewriteRule favicon /favicon.ico [R=301,L]
Run Code Online (Sandbox Code Playgroud)

但这意味着,当您实际请求时,/favicon.ico它会将您发送到无限重定向循环.

基本上我认为我需要的是具有这种效果的正则表达式:

| Request                | Response     |
|------------------------|--------------|
| favicon.png            | /favicon.ico |
| directory/favicon.png  | /favicon.ico |
| directory/favicon.ico  | /favicon.ico |
| favicon.ico            | <no match>   |
Run Code Online (Sandbox Code Playgroud)

Dsc*_*duc 11

我建议改变亚历克斯的优秀答案:

保持此部分相同:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC]
Run Code Online (Sandbox Code Playgroud)

在请求结束时检查的不只是.ico扩展名:

RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC]
Run Code Online (Sandbox Code Playgroud)

添加抓取当前请求主机名的第三个条件:

RewriteCond %{HTTP_HOST} (.+)
Run Code Online (Sandbox Code Playgroud)

最后更改最后一个RewriteRule以使用%1(表示最后匹配条件的反向引用):

RewriteRule (.*) http://%1/favicon.ico [R=301,L]
Run Code Online (Sandbox Code Playgroud)

最终结果如下:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC]
RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC]
RewriteCond %{HTTP_HOST} (.+)
RewriteRule (.*) http://%1/favicon.ico [R=301,L]
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人......


ale*_*lex 6

试试这个

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC] # if not already going to favicon.ico
RewriteCond %{REQUEST_URI} favicon\.ico [NC] # edit this line to match your favicon matching regex
RewriteRule (.*) http://www.domain.com.au/favicon.ico [R=301,L] #redirect to the real address
Run Code Online (Sandbox Code Playgroud)