如何将根目录或任何子目录中对 favicon.ico 的所有请求重定向到 /images/favicon.ico
5 回答
试试这个规则:
RewriteEngine on
RewriteRule ^favicon\.ico$ /images/favicon.ico [L]
编辑 对于具有任意路径段深度的favicon.ico :
RewriteCond $0 !=images/favicon.ico
RewriteRule ^([^/]+/)*favicon\.ico$ /images/favicon.ico [L]
对于最强大的方法的网站图标www.mysite.com/images/favicon.ico
将是:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico$ [NC]
RewriteCond %{HTTP_HOST} (.+)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301,L,NC]
解释:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico [NC]
:
- 确保在请求正确的 URI 时重定向规则不适用(例如,301 重定向会将正确的网站图标 URI 写入浏览器缓存 - 如果浏览器请求正确的 URI,则此行避免处理规则)
- [NC]表示它不区分大小写
RewriteCond %{HTTP_HOST} (.+)
:
- 检索 http 主机名 - 避免将主机名硬编码到RewriteRule
- 这意味着您可以在本地/测试服务器和生产服务器之间复制您的 .htaccess 文件而不会出现问题(或者需要将您的新站点基础 url 重新硬编码到你的重写规则)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301, L]
:
-^
是正则表达式的开头
-(.*)
是一个通配符组 - 这意味着favicon
在 URI 中的单词之前可以有零个或任意数量的字符(即,这是允许根目录或任何子目录包含在URI match)
-\.(ico|gif|png|jpe?g)
检查 URI 扩展是否匹配任何.ico
, .gif
, .png
, .jpg
, .jpeg
-$
是正则表达式的结尾
-http://%1/images/favicon.ico
是重定向 url - 它会注入我们在之前检索到的主机名RewriteCond
。请注意,这%1
是一个称为RewriteCond 的反向引用,这意味着它是最后一个RewriteCond
遇到的。(例如%2
将是倒数第二个RewriteCond
已经满足)
-R=301
意味着它是一个永久重定向 - 它将重定向存储在浏览器缓存中。测试时要小心——您需要在代码更改之间删除浏览器缓存,否则重定向不会更新。在您知道规则有效之前,可能会忽略它。
-L
表示它是此文件中要遵循的最后一个重定向.htaccess
- 您不需要它来使规则正常工作,因为一旦浏览器被定向到正确的 url,将不会满足第 1 行。如果没有第 1 行或L
RewriteRule 将导致永久循环(因为重定向 URL 将继续满足RewriteRule
条件)。但是,添加L
无论如何,如果您有其他遵循 favicon 规则的规则 - 因为在 favicon.ico 请求中,您可以(可能)忽略任何以下规则。
您可以在http://htaccess.mwl.be/测试.htaccess
规则
最后说明: - 请注意,您的任何子目录
中的文件中都没有任何其他 RewriteRule 。
- 例如,如果您将此答案放在根文件夹文件中,则文件夹中的类型规则可能会混淆结果。.htaccess
www.mysite.com/
.htaccess
RewriteRule (.*) xxx
www.mysite.com/images/
RewriteEngine on
RewriteRule ^(.*)favicon\.ico /images/favicon.ico [L]
这种快速重写应该可以解决问题:
RewriteRule ^(.*)favicon.ico /images/favicon.ico
我知道问题已被标记.htaccess
,但为什么不使用符号链接?
ln -s images/favicon.ico favicon.ico