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

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

De acordo com esta resposta:comprimento máximo do URL 257 caracteres para mod_rewrite?há um limite máximo de 255 caracteres com base no sistema de arquivos para usar mod_rewrite.

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

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

Não consigo usar o primeiro método, então estou tentando descobrir o segundo.

Coloquei as regras de reescrita na configuração do host virtual Apache conforme solicitado. No entanto, não consigo descobrir como remover REQUEST_FILENAME e ainda fazer com que minha estrutura de aplicativo da web (Dragonfly) ainda funcione.

Aqui está a parte das regras de reescrita que movi 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]

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

Responder1

As três linhas abaixo dizem 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 for um diretório”. O segundo significa “se o URI não for um link”. O terceiro significa “se o URI não for um arquivo”.

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

Há um propósito nas três linhas acima. Eles estão lá para que, se você adicionar um arquivo, diretório ou link simbólico real à raiz do documento e alguém solicitar esse arquivo, diretório ou link simbólico, o Apache o processará normalmente e não fará a reescrita. Se você sabe que nunca adicionará arquivos reais à raiz do documento, poderá comentá-los com segurança, sem quaisquer 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]

Isso interceptará quaisquer URIs que possuam uma única string com mais de 255 caracteres entre barras e os enviará diretamente para a reescrita sem verificar o sistema de arquivos. A opção [L] garante que o Apache não verifique mais nenhuma regra se corresponder a esta. Não há perigo de interceptar URIs que seriam mapeados para arquivos reais porque os URIs que correspondem a esse regex não serão caminhos de arquivo válidos.

Atualizar:

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

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

Responder2

O seguinte funciona para mim (testado no virtualhost padrão no debian com 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]

informação relacionada