longueur maximale de l'URL 257 caractères pour mod_rewrite?

11

Mon schéma d'URL est /foo/var1-var2-var3.../bar

J'utilise ces règles mod_rewrite:

RewriteBase /foo/
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^ index.php [PT,L]

Si la longueur de la chaîne «var1-var2 ...» est supérieure à 257 caractères, une erreur 403 interdite et une 404 sont renvoyées. Cependant, si la longueur de la chaîne "var1-var2 ..." est de 257 caractères ou moins et ensuite suivie d'une barre oblique, la longueur de l'url restante peut être de n'importe quelle longueur. Comment surmonter cette limite?

Daniel
la source

Réponses:

11

Vous rencontrez une limitation du système de fichiers sous-jacent.

Jetez un œil aux limites du système de fichiers . Vous verrez que la plupart ont une longueur de nom de fichier maximale de 255 octets. Ainsi, lorsque apache et / ou votre règle de réécriture vérifie si le fichier existe, une erreur est renvoyée à apache par le système d'exploitation.

Avec Apache, si vous placez des règles comme celle-ci dans le fichier .htaccess, il est trop tard pour contourner le problème. Apache aura déjà tenté de stat le nom de fichier long, lançant ainsi l'erreur de système de fichiers '(36) Nom de fichier trop long', renvoyant une erreur 403.

Je vois deux options:

  1. Modifiez le format URL de votre application à 255 caractères maximum entre chaque barre oblique.
  2. Déplacez les règles de réécriture dans la configuration de l'hôte virtuel apache et supprimez le REQUEST_FILENAME.
h0tw1r3
la source
Si un fichier .htaccess n'inclut pas {REQUEST_FILENAME}, mais renvoie toujours un 403, cela pourrait-il toujours être le problème? ( serverfault.com/questions/140852/… )
philfreo
1
Vous devez déplacer les règles de réécriture dans la configuration d'apache . C'est le seul moyen de conserver la fonctionnalité et de contourner le problème.
h0tw1r3
3
Lorsque vous déplacez des règles de .htaccess vers la configuration d'hôte virtuel apache, vous devez modifier %{REQUEST_FILENAME}=> %{DOCUMENT_ROOT}%{REQUEST_FILENAME}et également ajouter une barre oblique au début de vos modèles d'URL, par exemple pas RewriteRule ^abc ...mais RewriteRule ^/abc .... Vous devez aimer la simplicité du mod_rewrite ...
ash108
2
La partie «Déplacer les règles de réécriture dans la configuration de l'hôte virtuel apache» est dorée: elle fonctionne réellement lorsqu'elle est correctement mise en œuvre, contrairement à de nombreuses autres solutions de contournement que j'ai essayées.
ash108