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

mod_rewrite все файлы, кроме двух, вызывающие цикл

Я пытаюсь настроить веб-сайт, чтобы разрешить создание файла семафора для закрытия сайта. Я хочу следовать следующей логике:

  1. когда файл семафора существует
  2. и запрос не для /style.css или /favicon.icon
  3. показать содержимое /closed.html

У меня работают 1 и 3, но мои исключения для 2 приводят к циклу обработки при запросе style.css или favicon.ico. Это моя последняя попытка:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/style.css
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond /usr/local/etc/site/closed -f
RewriteRule ^.*$ /closed.html [L]

Это в блоке VirtualHost, а не в каталоге. В игре нет файла .htaccess.

Я также недавно пробовал это, основываясь на ответе, который я нашел в другом месте, но с тем же результатом (зацикливанием):

RewriteCond %{REQUEST_URI} ^/style.css [OR]
RewriteCond %{REQUEST_URI} ^/favicon.ico
RewriteRule ^.*$ - [L]
RewriteCond /usr/local/etc/site/closed -f
RewriteRule ^.*$ /closed.html [L]

Я ожидаю, что запрос для /style.css или /favicon.ico не будет соответствовать одному из первых двух условий перезаписи, что должно предотвратить перезапись URI, что должно остановить итерацию mod_rewrite. Однако mod_rewrite, похоже, думает, что URI был переписан в этих случаях, и повторяет правила снова (и снова, и снова). Вышеупомянутое работает правильно во всех случаях, кроме style.css или favicon.ico. В таких случаях я превышаю пределы цикла.

Что мне здесь не хватает, чтобы остановить итерацию перезаписи, когда кто-то запрашивает style.css или favicon.ico?

РЕДАКТИРОВАТЬ: Вот пример того, что происходит при использовании первого набора правил, когда поступает запрос для /style.css, на уровне 9 журнала. Это только первые две итерации ... цикл продолжается идентичным образом, пока не будет достигнут предел.

2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (2) init rewrite engine with requested uri /style.css
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (3) applying pattern '^.*$' to uri '/style.css'
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (4) RewriteCond: input='/style.css' pattern='!^/style.css' => not-matched
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (1) pass through /style.css  
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (2) init rewrite engine with requested uri /style.css
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (3) applying pattern '^.*$' to uri '/style.css'
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (4) RewriteCond: input='/style.css' pattern='!^/style.css' => not-matched
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (1) pass through /style.css

/closed.html является причиной этого бесконечного цикла.

Думаю, это может решить вашу проблему. Я только что добавил одну строку к вашей первой попытке (см. Строку 4):

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/style.css
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/closed.html
RewriteCond /usr/local/etc/site/closed -f
RewriteRule ^.*$ /closed.html [L]

Попробуй добавить

RewriteLog /tmp/rewrite.log
RewriteLogLevel 4

И посмотрите в файл журнала, если это может быть полезно.

Я попробовал вашу установку в установке Apache на современной CentOS 6.

Вот мой конфиг

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/style.css
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond /tmp/closed -F
RewriteRule ^.*$ /closed.html [L]

Ниже приведен журнал, подтверждающий, что это работает:

$ curl https://localhost/
<!DOCTYPE html>
<title>It works!</title>
<p>It works!</p>

$ curl https://localhost/style.css
html {
background: black;
color: white;
}

$ touch /tmp/closed
$ curl https://localhost/
<!DOCTYPE html>
<title>We're closed</title>
<p>We're closed</p>

$ curl https://localhost/style.css
html {
background: black;
color: white;
}

РЕДАКТИРОВАТЬ это не то, что вы хотите для своего вопроса, я оставляю его здесь, чтобы он мог помочь другим с аналогичными проблемами.

Другой способ решить вашу проблему - вот так

<LocationMatch "^/(?!410\.html)">
    RedirectMatch gone .*
</LocationMatch>
ErrorDocument 410 /410.html

куда 410.html это ваша страница с ошибкой. Это отправит 410 ушел код статуса клиенту, указывающий, что сайт ушел и больше не вернется.