Назад | Перейти на главную страницу

Как сбросить директиву Apache RewriteCond?

У меня есть такая конфигурация Apache:

# Image hotlinking rule
RewriteCond %{HTTP_REFERER} ^http://badsite\.com/
RewriteRule .*/static/artwork/.*\.(jpg|png)$ /static/images/hotlink.png [L]

# Redirects
RewriteRule ^static/artwork/(.+)$    http://cdn.mysite.com/artwork/$1    [L,R=301]

# CodeIgniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

Он должен сделать следующее:

  1. Если запрос на изображение исходит от badsite.com, заблокируйте его и вместо этого отобразите изображение хотлинка.
  2. Если поступает обычный запрос на изображение, перенаправьте его на изображение, размещенное на поддомене cdn.
  3. В противном случае, если запрос не является файлом или каталогом, загрузите страницу веб-страницы (проходит через CodeIgniter).

Однако я думаю, что первая RewriteCond применяется к правилу перенаправления, а не к правилу хотлинкинга, потому что запросы изображений от этого реферера перенаправляются в CDN, а не в образ хотлинкинга. An пример в документации Apache (внизу раздела) означает, что разрыв строки останавливается RewriteCond применяется, но этого не происходит.

Есть ли способ «сбросить» RewriteCond правило, или в моей конфигурации есть другая ошибка?

Разрывы строк совершенно несущественны; а RewriteCond относится только к одному RewriteRule; тот, что прямо под ним.

Было бы полезно предоставить дополнительную информацию о вашей конфигурации, поскольку контекст важен в Apache. Но, судя по тому, что ваш второй RewriteRule работает, похоже, что эта конфигурация либо установлена ​​в <Directory> контекст или .htaccess файл, и это /static лежит в основе этого контекста.

Учитывая это, вы сначала RewriteRule никогда не будет совпадать. Измените свой узор ..

.*/static/artwork/.*\.(jpg|png)$

..к ..

^static/artwork/.*\.(jpg|png)$