URLs reescritos com tamanho de parâmetro> 255 não funcionam

12

Estou usando o mod_rewrite para reescrever URLs como este:

http://example.com/1,2,3,4/foo/

Ao fazer isso no .htaccess:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

Funciona bem, exceto quando "1,2,3,4" se transforma em uma sequência com mais de 255 caracteres, o Apache retorna um "403 Proibido".

Não há nenhum problema em visitar foo.php?id=1,2,3,4diretamente, mesmo com uma sequência de caracteres muito longa, mas isso não é uma opção para mim.

Existe algum Apache ou outra configuração que eu deva ajustar?

ATUALIZAÇÃO : ativei o RewriteLog com o RewriteLogLevel 9. Com uma sequência de identificação curta, recebo várias linhas no meu arquivo de log. Mas quando a cadeia de caracteres de ID é maior que 255 caracteres, nada é registrado (parece que o mod_rewrite nem está sendo executado?).

Se você acha esta pergunta interessante / útil, faça um voto positivo.

philfreo
fonte
Isso pode ser um problema de regex? Você verificou se a solicitação reescrita está correta para cadeias com mais de 255 caracteres? Caso contrário, talvez você possa postar as solicitações de pré e pós-reescrita.
#
3
Habilite o log do mod_rewrite com RewriteLoge RewriteLogLevelpara que você possa ver o que está sendo correspondido e como realmente está sendo reescrito. Eu acho que apenas 255 caracteres estão sendo copiados $1e isso acaba sendo um idque o cliente não está autorizado a ver, então o Apache retorna o 403. Eu não olhei o código, mas pode ser que o Apache manipule a referência anterior em um buffer fixo de 256 bytes (o 256º é reservado para o NULL final).
James Sneeringer
Veja a atualização em questão - nada é registrado por longos parâmetros
philfreo

Respostas:

8

Você acha que está enfrentando uma limitação do sistema de arquivos?

Pode ser que o comprimento máximo do nome do arquivo seja 255 bytes e quando o apache ou a regra mod_rewrite verifica se o arquivo existe, um erro é retornado ao apache pelo sistema operacional.

Se você colocar alguma regra no seu arquivo .htaccess, é tarde demais para solucionar o problema. O Apache já tentou especificar o nome do arquivo e gerou um erro no sistema de arquivos '(36) Nome do arquivo muito longo', retornando um erro 403.

Talvez você possa alterar o padrão de URL dentro do seu aplicativo. para um máximo de 255 caracteres de barra para barra.

EDIT: procure aqui uma resposta detalhada para esta questão. Peguei emprestado o meu de lá.

microspino
fonte
Sim, atualmente é tudo o que podemos fazer, mas espero uma solução alternativa ou um ajuste de configuração.
Philfreo # 20/10
3
Microspino, parece que você recortou e colou parte de sua resposta da resposta de @Jeff Clark aqui: serverfault.com/questions/120397/… . Você deve criar um link para essa resposta, para que ele receba alguma notoriedade.
Stefan Lasiewski
@Stefan lasieswski: você está certo, eu adicionei uma referência.
Microspino
então, você está pensando que talvez o Apache esteja tentando definir o arquivo solicitado independentemente - quer dizer, essa pode ser a única maneira de explicar que o URL muito longo nem está sendo captado pelo mecanismo de reescrita ...
HorusKol
Sim, essa é a minha ideia, embora eu pense que, em geral, ter urls e nomes de arquivos tão longos deve ser evitado por vários motivos. Portanto, o melhor conselho que eu poderia pensar talvez seja alterar algo no padrão da URL se o nome do arquivo já não for muito longo.
Microspino
2

Há uma pergunta semelhante sobre esse limite aqui :

Você pode estar executando uma limitação do sistema de arquivos subjacente

Não sei se você está usando REQUEST_FILENAME em algum lugar da configuração .htaccess, portanto, não sei se a solução fornecida está funcionando.

GmonC
fonte
Isso faz sentido, mas não, eu não sou. Editei minha pergunta para incluir o arquivo .htaccess na sua totalidade. Outras ideias?
Philfreo 17/05
De acordo com "Detalhes técnicos do Apache mod_rewrite" em httpd.apache.org/docs/trunk/rewrite/tech.html "Embora o mod_rewrite reescreva URLs em URLs, URLs para nomes de arquivos e até mesmo nomes de arquivos, a API atualmente fornece apenas um URL para -filename hook. ". Portanto, mesmo que você não esteja atingindo um arquivo real, talvez o gancho do URL para o nome do arquivo esteja atingindo o limite de recursos do SO?
Stefan Lasiewski
0

Definitivamente uma pergunta interessante. Você executa o mod_security e, se sim, tentou sem ele? Talvez ele simplesmente não goste de nomes de caminhos longos ou nomes de caminhos longos com vírgulas não codificadas neles? ^^

Embora instintivamente pareça mais um limite no caminho do URL ou pelo menos segmentos individuais dele ou a interpretação subjacente do sistema de arquivos, como GmonC escreveu. Isso também explicaria por que o URL regular com a parte longa da string de consulta funciona bem.

Eu acho que o ASP.NET mais antigo costumava ter um limite de caminho de solicitação de ~ 260 caracteres ou algo assim.

Oskar Duveborn
fonte
Veja a atualização para a pergunta. E não, eu não vejo um arquivo mod_security em /usr/include/apache2/ou /usr/lib/apache2/modules/(mas eu vejo mod_rewrite lá), então estou assumindo que ele não está instalado.
Philfreo 17/05
0

Você está disposto a mudar servidores http? Considere nginx em vez de apache.

E use http://wiki.nginx.org/NginxHttpRewriteModule

JavaRocky
fonte
Verdade? Não há como fazer isso no Apache?
Philfreo