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.


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á.


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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.