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,4
diretamente, 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.
fonte
RewriteLog
eRewriteLogLevel
para 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$1
e isso acaba sendo umid
que 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).Respostas:
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á.
fonte
Há uma pergunta semelhante sobre esse limite aqui :
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.
fonte
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.
fonte
/usr/include/apache2/
ou/usr/lib/apache2/modules/
(mas eu vejo mod_rewrite lá), então estou assumindo que ele não está instalado.Você está disposto a mudar servidores http? Considere nginx em vez de apache.
E use http://wiki.nginx.org/NginxHttpRewriteModule
fonte