comment Apache Processus Le chemin avec l'URL encodé en pourcentage?

J'ai rencontré un cas inattendu quand Apache Je me suis donné une erreur 404 Au lieu de permettre mod_rewrite traiter le chemin lorsque l'une des parties du trajet codé en pourcentage était l'URL elle-même HTTP.

Par exemple:

GET /myfolder/http%3A%2F%2Flocalhost%2Fnotify HTTP/1.0

J'ai une règle très simple

/myfolder/.htaccess

fichier qui envoie

tout

Ce n'est pas un fichier dans

/myfolder/

au script. Cela fonctionne bien avec d'autres valeurs codées comme un pourcentage, mais dans ce cas Apache Jamais traite

RewriteRule

de

.htaccess

déposer. Je peux cod une valeur deux fois comme solution de contournement, mais il semble que Apache toujours avoir à traiter les phases mod_rewrite. Je suppose que l'URL sera simplement le paramètre d'entrée du script.

Voici les directives pertinentes mod_rewrite dans

/myfolder/.htaccess

:

RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule .* ./script-the-world.php

Les règles d'inversion ne sont pas traitées. J'ai dans la configuration du serveur

RewriteLogLevel 5

etc. et

tail -f /var/log/http/rewrite.log

Montre toutes mes demandes

/myfolder/

correspond ... En plus de ceux mentionnés ci-dessus. Je tiens à dire que quelque chose d'intérieur se passe dans le cas particulier décrit ci-dessus, mais je n'ai aucune idée de ce que c'est. J'espère que quelqu'un peut connaître un autre module qui interfère avec ce que j'essaie de jouer.

il Apache 2.2.16.
Invité:

Blanche

Confirmation de:

Vous devrez allumer
http://httpd.apache.org/docs/2 ... ashes
, Ce qui mènera au fait que Apache Autoriser les URL avec

%2F

et

%5C

en eux au lieu d'émettre 404. Bien sûr, vous devez vous assurer que votre script PHP traite correctement le décodage. URL, Puisque ce n'est pas un devoir Apache.

Babette

Confirmation de:

Depuis que ce problème est déjà 9 Des années, mais le problème est toujours pertinent, je pensais que je vais donner une réponse plus complète sur la façon de le résoudre.

Permettre

%F2

et

%5C

sur vos moyens sans avoir une erreur 404, Vous devez ajouter la chaîne suivante à la configuration. apache2:

AllowEncodedSlashes NoDecode

De Apache2.4
https://httpd.apache.org/docs/ ... ashes
:

DANS

AllowEncodedSlashes

La directive permet aux URL contenant des voies codées (

%2F

pour / Et en plus

%5C

pour \ Dans les systèmes concernés) Pour une utilisation dans les informations de chemin.

Avec signification par défaut

Off

, De telles URL sont rejetées avec une erreur 404 (pas trouvé).

Avec signification

On

Ces URL sont acceptées et les fonctionnalités obliques codées sont décodées, comme tous les autres caractères codés.

Avec signification

NoDecode

De telles URL sont acceptées, mais les barres obliques codées ne sont pas décodées, mais restent dans l'état codé.

Parce que

NoDecode

A été présenté dans 2.4, Si vous utilisez toujours Apache2.2, Vous pouvez définir la valeur

On

au lieu. Soyez prudent, leur fonctionnalité n'est pas la même. Comme indiqué dans la documentation,

NoDecode

ne décodera pas la chaîne et la laissera telle qu'elle est, alors que

On

volonté.

Que personne n'a expliqué (au moins moi), Était



Je dois appliquer cette valeur. Il y a des liens avec

httpd.conf

Fichier, mais bonne chance à la recherche de ce fichier si vous utilisez Apache2 dans Debian. DANS Ubuntu Le fichier est appelé

apache2.conf

. Et si vous ajoutez une chaîne dans

apache2.conf

Fichier, vous ne verrez probablement pas de gros changements.

La raison en est que, comme vous le savez peut-être, vos fichiers de configuration incluront des partitions pour

Hôte virtuel

. Et configs à l'intérieur de chacun d'eux

<virtualhost>

section Appliquer après les sections correspondantes en dehors de la définition d'hôte virtuelle.

Cela permet aux hôtes virtuels de remplacer la configuration du serveur principal. Qu'est-ce qui est généralement bon. À l'exception de ce contexte quand il annule techniquement

AllowEncodedSlashes

directif (et retournez-le à la valeur par défaut

Off

), Si vous ne spécifiez pas clairement pas dans chaque

<virtualhost>

section, quelle valeur devrait être.

Donc, si vous voulez résoudre ce problème, procédez comme suit (Au moins sur Ubuntu):

Aller à

/etc/apache2/sites-enabled

Ouvrez chaque fichier trouvé.

Ajouter

AllowEncodedSlashes NoDecode

à l'intérieur

chaque

<virtualhost>

La section qui vous concerne.

Enregistrez le fichier.

Redémarrer apache2:

sudo systemctl restart apache2

.
</virtualhost></virtualhost></virtualhost>

Pour répondre aux questions, connectez-vous ou registre