mod_rewrite регулярное выражение для сопоставления, только если определенная строка НЕ ​​существует - PullRequest
7 голосов
/ 05 февраля 2009

Просматривая журналы моего сервера, я вижу, что многие страницы на моем сайте запрашивают favicon.ico, favicon.jpg, favicon.png и т. Д. В различных каталогах.

Вместо того, чтобы пробираться по каждой странице, чтобы попытаться выяснить, откуда поступает каждый неправильный запрос, я пишу некоторые правила перенаправления apache, чтобы изменить запрос для любого URL-адреса, содержащего "favicon", для перенаправления на /favicon.ico

Моя первоначальная наивная попытка была такой:

RewriteRule favicon /favicon.ico [R=301,L]

Но это означало, что когда вы на самом деле запросили /favicon.ico, это отправило бы вас в бесконечный цикл перенаправления.

В основном мне нужно регулярное выражение, которое имеет такой эффект:

| Request                | Response     |
|------------------------|--------------|
| favicon.png            | /favicon.ico |
| directory/favicon.png  | /favicon.ico |
| directory/favicon.ico  | /favicon.ico |
| favicon.ico            | <no match>   |

Ответы [ 4 ]

11 голосов
/ 05 февраля 2009

Пара изменений, которые я бы предложил изменить Отличный ответ Алекса :

Оставьте этот раздел таким же:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC]

Проверьте не только расширение .ico в конце запроса:

RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC]

Добавить третье условие, которое захватывает текущее имя хоста запроса:

RewriteCond %{HTTP_HOST} (.+)

Наконец, измените последний RewriteRule на использование% 1 ( обратная ссылка, представляющая последнее найденное условие ):

RewriteRule (.*) http://%1/favicon.ico [R=301,L]

Окончательный результат будет выглядеть так:

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]

Надеюсь, это кому-нибудь поможет ...

6 голосов
/ 05 февраля 2009

Попробуйте это

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
1 голос
/ 19 апреля 2012

с макушки головы:

RewriteRule favicon[.](\w*)$ /favicon.ico [L]
0 голосов
/ 05 февраля 2009

Я бы использовал это правило:

RewriteCond %{REQUEST_URI} !^/favicon\.ico$
RewriteRule favicon /favicon.ico [L,R=301]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...