Como alterar mod_rewrite para evitar {REQUEST_FILENAME} para obter um limite de URL de 255 caracteres?

4

De acordo com esta resposta: tamanho máximo da URL 257 caracteres para mod_rewrite? existe um limite máximo de 255 caracteres baseado no sistema de arquivos para usar mod_rewrite.

De acordo com a resposta aceita, existem duas soluções:

  1. Altere o formato de URL do seu aplicativo para um máximo de 255 caracteres entre cada barra.
  2. Mova as regras de reconfiguração para a configuração do host virtual do Apache e remova o REQUEST_FILENAME.

Eu não posso usar o primeiro método, então estou tentando descobrir o segundo.

Eu coloquei as regras de reconfiguração na configuração do host virtual Apache, conforme solicitado. No entanto, não consigo descobrir como remover o REQUEST_FILENAME e ainda ter meu framework de aplicativo da Web (Dragonfly) ainda funcionando.

Aqui está a parte das regras de reescrita que eu mudei de .htaccess para o arquivo de configuração do host virtual do Apache:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$

# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]

Eu tentei remover {REQUEST_FILENAME} e isso quebra a estrutura de várias maneiras. Como reescrevo isso sem usar {REQUEST_FILENAME}?

    
por Jeremy Reimer 23.11.2011 / 01:30

2 respostas

2

As três linhas abaixo informam ao Apache para verificar o sistema de arquivos para ver se o arquivo existe.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

O primeiro significa "se o URI não é um diretório". O segundo significa "se o URI não é um link". O terceiro significa "se o URI não é um arquivo".

Se você remover ou comentar essas linhas, o Apache aplicará a reescrita abaixo a todos os arquivos que não terminarem em ".html" ou ".nl" e não verificarão o sistema de arquivos para ver se o arquivo existe primeiro .

Existe um propósito para as três linhas acima. Eles estão lá para que, se você adicionar um arquivo, diretório ou link simbólico ao seu documento root e alguém solicitar esse arquivo, diretório ou link simbólico, o Apache irá processá-lo como normal e não reescrever. Se você souber que nunca adicionará arquivos reais à raiz do documento, poderá comentá-los com segurança sem efeitos colaterais.

Uma mudança potencialmente melhor seria adicionar uma nova regra acima das três linhas como esta:

RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]

Isto irá interceptar quaisquer URIs que possuam uma única cadeia de caracteres com mais de 255 caracteres entre barras e enviá-las diretamente para a reescrita sem verificar o sistema de arquivos. A opção [L] garante que o Apache não verifique mais regras se corresponder a esta. Não há perigo de interceptar URIs que seriam mapeados para arquivos reais porque os URIs que correspondem a essa regex não serão caminhos de arquivos válidos.

Atualização:

Um regex que corresponde a qualquer URI com pelo menos 255 caracteres.

RewriteRule (.{255}) index.cgi?$1 [L,QSA]
    
por 23.11.2011 / 09:01
0

O seguinte funciona para mim (testado no virtualhost padrão no debian com o apache 2.2.21).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.cgi?$1 [L,QSA]
    
por 25.11.2011 / 06:58