J'utilise mod_rewrite pour réécrire des URL comme celle-ci:
http://example.com/1,2,3,4/foo/
En faisant cela dans .htaccess:
RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]
Cela fonctionne très bien, sauf lorsque "1,2,3,4" se transforme en une chaîne de plus de 255 caractères, Apache renvoie un "403 interdit".
Il n'y a aucun problème à visiter foo.php?id=1,2,3,4
directement, même avec une chaîne d'identification très longue, mais ce n'est pas une option pour moi.
Existe-t-il un Apache ou un autre paramètre à modifier?
MISE À JOUR : J'ai activé RewriteLog avec RewriteLogLevel 9. Avec une courte chaîne d'identification, j'obtiens plusieurs lignes dans mon fichier journal. Mais lorsque la chaîne id est supérieure à 255 caractères., Rien n'est enregistré (il semble que mod_rewrite ne s'exécute même pas?).
Si vous trouvez cette question intéressante / utile, veuillez la voter.
la source
RewriteLog
etRewriteLogLevel
ainsi vous pouvez voir ce qui est mis en correspondance et comment il est vraiment en cours de réécriture. Je suppose que seuls 255 caractères sont copiés dans$1
, et cela finit par être unid
que le client n'est pas autorisé à voir, donc Apache renvoie le 403. Je n'ai pas regardé le code, mais il se pourrait qu'Apache manipule la référence arrière dans un tampon fixe de 256 octets (le 256e est réservé pour la terminaison NULL).Réponses:
Pensez-vous que vous rencontrez une limitation du système de fichiers?
La longueur maximale du nom de fichier peut être de 255 octets et lorsque apache ou la règle mod_rewrite vérifie si le fichier existe, une erreur est renvoyée à apache par le système d'exploitation.
Si vous placez une règle dans votre fichier .htaccess, il est trop tard pour contourner le problème. Apache aura déjà essayé de déclarer le nom de fichier et l'erreur de système de fichiers levée '(36) Nom de fichier trop long', renvoyant une erreur 403.
Vous pouvez peut-être modifier le modèle d'URL dans votre application. jusqu'à un maximum de 255 caractères de barre oblique à barre oblique.
EDIT: regardez ici pour une réponse détaillée à ce problème. J'ai emprunté le mien à partir de là.
la source
Il y a une question similaire à propos de cette limite ici :
Je ne sais pas si vous utilisez REQUEST_FILENAME quelque part dans votre configuration .htaccess, alors je ne sais pas si la solution fournie va fonctionner.
la source
Certainement une question intéressante. Exécutez-vous mod_security et si oui, avez-vous essayé sans? Peut-être qu'il n'aime tout simplement pas les noms de chemin long ou les noms de chemin long avec des virgules non codées? ^^
Bien que cela ressemble instinctivement plus à une limite sur le chemin de l'url ou au moins à des segments individuels de celui-ci ou à l'interprétation du système de fichiers sous-jacente comme l'écrit GmonC. Cela expliquerait également pourquoi l'URL régulière avec la partie longue dans la chaîne de requête fonctionne correctement.
Je pense qu'ASP.NET plus ancien avait une limite de chemin de requête de ~ 260 caractères ou quelque chose aussi.
la source
/usr/include/apache2/
ou/usr/lib/apache2/modules/
(mais j'y vois mod_rewrite), donc je suppose qu'il n'est pas installé.Êtes-vous prêt à changer de serveur http? Considérez alors nginx au lieu d'apache.
Et utilisez http://wiki.nginx.org/NginxHttpRewriteModule
la source