.htaccess - redirect favicon
How do I redirec开发者_开发知识库t all requests for favicon.ico in root directory or any subdirectory to /images/favicon.ico
Try this rule:
RewriteEngine on
RewriteRule ^favicon\.ico$ /images/favicon.ico [L]
Edit And for favicon.ico with arbitrary path segment depth:
RewriteCond $0 !=images/favicon.ico
RewriteRule ^([^/]+/)*favicon\.ico$ /images/favicon.ico [L]
For a favicon at www.mysite.com/images/favicon.ico
the most robust method would be:
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]
Explanation:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico [NC]
:
- ensures that the redirect rule does NOT apply if the correct URI is requested (eg a 301 redirect will write the correct favicon URI to browser cache - and this line avoids processing the rule if the browser requests the correct URI)
- [NC] means it's not case sensitive
RewriteCond %{HTTP_HOST} (.+)
:
- retrieves the http host name - to avoid hard coding the hostname into the RewriteRule
- this means you can copy your .htaccess file between local/test server and production server without problems (or the need to re-hardcode your new site base url into your RewriteRule)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301, L]
:
- ^
is the start of the regex
- (.*)
is a wildcard group - which means that there can be zero or any number of characters before the word favicon
in the URI (ie this is the part that allows root directory or any subdirectories to be included in the URI match)
- \.(ico|gif|png|jpe?g)
checks that the URI extension matches any of .ico
, .gif
, .png
, .jpg
, .jpeg
- $
is the end of the regex
- http://%1/images/favicon.ico
is the redirect url - and it injects the hostname we retrieved in the previous RewriteCond
. Note that the %1
is a called a RewriteCond backreference this means it is the last RewriteCond
that has been met. (eg %2
would be the 2nd-last RewriteCond
that to have been met)
- R=301
means it's a permanent redirect - which stores the redirect in the browser cache. Be careful when testing - you'll need to delete browser cache between code changes or the redirect won't update. Probably leave this out until you know the rule works.
- L
means its the last redirect to be followed in this .htaccess
file - you won't need this to get the rule working since line 1 won't be met once the browser is directed to the correct url. Without the either line 1 or L
the RewriteRule will result in a permanent loop (since the redirect URL will keep satisfying the RewriteRule
conditions). However, it's a good idea to add the L
anyway if you have other rules following the favicon rules - since on a favicon.ico request, you can (probably) ignore any following rules.
You can test .htaccess
rules at http://htaccess.mwl.be/
Final Note:
- be careful that you don't have any other RewriteRule in an .htaccess
file located in any of your sub-directories.
- eg if you put this answer in your www.mysite.com/
root folder .htaccess
file, a RewriteRule (.*) xxx
type rule in your www.mysite.com/images/
folder can mess with the results.
RewriteEngine on
RewriteRule ^(.*)favicon\.ico /images/favicon.ico [L]
I know the question is tagged .htaccess
but, why not use a symlink?
ln -s images/favicon.ico favicon.ico
This quick rewrite should do the trick:
RewriteRule ^(.*)favicon.ico /images/favicon.ico
精彩评论