mod_rewrite todos menos dois arquivos causando loop

1

Estou tentando configurar um site para permitir a criação de um arquivo de semáforo para fechar o site. A lógica que quero seguir é:

  1. quando o arquivo de semáforo existe
  2. e a solicitação não é para /style.css ou /favicon.icon
  3. mostra o conteúdo de /closed.html

Eu tenho 1 e 3 funcionando, mas minhas exceções para 2 resultam em um loop de processamento quando style.css ou favicon.ico são solicitados. Esta é a minha tentativa mais recente:

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

Isso está em um bloco VirtualHost, não em um diretório. Não há arquivo .htaccess em jogo.

Eu também tentei recentemente isso, com base em uma resposta que encontrei em outro lugar, mas com o mesmo resultado (em loop):

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

Eu espero que um pedido para /style.css ou /favicon.ico não corresponda a uma das duas primeiras condições de reescrita, o que deve impedir que o URI seja reescrito, o que deve parar a iteração mod_rewrite. No entanto, mod_rewrite parece pensar que o URI foi reescrito nesses casos e repete as regras novamente (e novamente, e novamente). O acima funciona corretamente em todos os casos, exceto para style.css ou favicon.ico. Nesses casos, excedemos os limites do loop.

O que estou perdendo aqui para fazer com que a reescrita da iteração pare quando alguém solicita style.css ou favicon.ico?

EDIT : Aqui está um exemplo de nível de log 9 do que acontece usando o primeiro conjunto de regras quando uma solicitação chega para /style.css. Esta é apenas as duas primeiras iterações ... continua a fazer um loop idêntico até que o limite seja atingido.

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
    
por mpounsett 29.05.2014 / 16:55

3 respostas

0

Tente adicionar

RewriteLog /tmp/rewrite.log
RewriteLogLevel 4

E procure no arquivo de log se ele puder ser útil.

    
por 29.05.2014 / 17:21
0

/closed.html é a causa desse loop infinito.

Acho que isso pode resolver seu problema. Acabei de adicionar uma linha à sua primeira tentativa (veja a linha 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]
    
por 29.05.2014 / 18:17
0

Eu tentei sua configuração em uma configuração do Apache em um CentOS 6 atualizado.

Aqui está minha configuração

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

A seguir, um log que prova que funciona:

$ 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;
}

EDITAR isto não é o que você quer para sua pergunta, eu deixo aqui para que possa ajudar outras pessoas com problemas similares.

Outra maneira de resolver seu problema é assim

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

Onde 410.html é sua página de erro. Isso enviará o código de status 410 para o cliente, indicando que o site se foi e não vai voltar.

    
por 29.05.2014 / 17:37