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:
- Altere o formato da URL do seu aplicativo para no máximo 255 caracteres entre cada barra.
- 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]