Besoin d'autoriser les slashs encodés sur Apache
j'essaie actuellement de placer une URL dans une URL. Par exemple:
http://example.com/url/http%3A%2F%2Fwww.url2.com
je suis conscient que je dois encoder L'URL, ce que j'ai fait, mais maintenant je reçois une erreur 404
de retour du serveur plutôt que mon application. Je pense que mon problème réside dans apache et peut être résolu avec la directive AllowEncodedSlashes On
.
j'ai essayé de mettre la directive en bas du httpd.conf sans effet, et je ne sais pas quoi faire ensuite. Suis-Je le mettre dans le bon endroit? Si oui, quelqu'un aurait-il d'autres solutions?
7 réponses
ce problème n'est pas lié au bogue 35256 D'Apache. Il est plutôt lié au bogue 46830. Le paramètre AllowEncodedSlashes
n'est pas hérité par les hôtes virtuels, et les hôtes virtuels sont utilisés dans de nombreuses configurations Apache par défaut, comme celle d'Ubuntu. La solution consiste à ajouter le paramètre AllowEncodedSlashes
à L'intérieur d'un conteneur <VirtualHost>
( /etc/apache2/sites-available/default
dans Ubuntu).
bogue 35256 : %2F
sera décodé dans PATH_INFO (Documentation vers AllowEncodedSlashes
dit pas de décodage)
Bug 46830 : si AllowEncodedSlashes On
est placé dans le contexte global, il n'est pas hérité par les hôtes virtuels. Vous devez définir explicitement AllowEncodedSlashes On
dans chaque conteneur <VirtalHost>
.
la documentation sur la fusion des différentes sections de configuration dit:
Les Sectionsà l'intérieur des sections
<VirtualHost>
sont appliquées après les sections correspondantes les sections à l'extérieur de l'hôte virtuel définition. Cela permet aux hôtes virtuels de modifier la configuration du serveur principal.
j'ai continué à venir à travers ce post pour un autre problème. Permettez-moi de vous expliquer très rapidement.
j'avais la même URL de style et j'essayais aussi de le proxy.
exemple: requêtes Proxy de /example/
vers un autre serveur.
/example/http:%2F%2Fwww.someurl.com/
Issue 1: Apache estime que c'est une url invalide
Solution: AllowEncodedSlashes On
dans httpd.conf
Question 2: Apache décode les slashes codés
Solution: AllowEncodedSlashes NoDecode
dans httpd.conf (Nécessite Apache 2.3.12+)
Question 3: mod_proxy les tentatives de ré-encoder (double encodage) l'URL de changer %2F
à %252F
(eg. /example/http:%252F%252Fwww.someurl.com/
)
Solution: dans httpd.conf
utilisez le ProxyPass
mot-clé nocanon
pour passer L'URL brute par le proxy.
ProxyPass http://anotherserver:8080/example/ nocanon
httpd.fichier conf:
AllowEncodedSlashes NoDecode
<Location /example/>
ProxyPass http://anotherserver:8080/example/ nocanon
</Location>
référence:
j'ai perdu beaucoup d'heures sur ce problème aussi. Je suis un peu en retard à la fête, mais il semble qu'il ya une solution maintenant.
comme pour ce thread , il y a (était) un bug dans Apache tel que si vous avez AllowEncodedSlashes On
, il empêche le 404, mais il décode par erreur 151980920" les slashs, ce qui est incorrect selon le RFC.
Ce commentaire propose une solution, à savoir use:
AllowEncodedSlashes NoDecode
à la lumière de tous les tracas, j'ai opté pour base64_encoding suivi de urlencoding. Il fonctionne sans avoir à jouer avec les paramètres du serveur apache ou à regarder les rapports de bogues. Il fonctionne également sans avoir à mettre l'url dans la section requête.
$enc_url = urlencode(base64_encode($uri_string));
et pour le récupérer
$url = base64_decode(urldecode($enc_url));
http://example.com/admin/supplier_show/8/YWRtaW4vc3VwcGxpZXJz
http://example.com/admin/supplier_show/93/YWRtaW4vc3VwcGxpZXJzLzEwMA%3D%3D
après quelques tests, et en regardant le bug dans Apache, j'ai conclu que malgré les solutions proposées dans différents forums, il s'agit d'un problème non résolu dans Apache. Voir le bug: https://issues.apache.org/bugzilla/show_bug.cgi?id=35256
le contournement qui fonctionne pour moi est de reformuler L'URI de sorte que l'élément qui peut contenir les barres obliques échappées se trouve dans la section de requête de l'URI, au lieu du chemin. Mes tests montrent que lorsque ils sont là, ils ne sont pas filtrés par Apache, peu importe les paramètres Allowencodedslashs et AcceptPathInfo.
: http://test.com/url?http%3A%2F%2Fwww.url2.com
ou: http://test.com/url?theURL=http%3A%2F%2Fwww.url2.com
au lieu de: http://test.com/url/http%3A%2F%2Fwww.url2.com
cela signifie un changement d'architecture pour notre projet, mais cela semble inévitable. Espérons que vous avez trouvé une solution.
j'ai le même problème avec" AllowEncodedSlashes On", et j'ai essayé de placer la directive à deux endroits différents: apache2.conf, httpd.conf, et à l'intérieur d'une section, comme dans un exemple à http://www.jampmark.com/web-scripting/5-solutions-to-url-encoded-slashes-problem-in-apache.html .
si vous ne l'avez pas déjà fait, vous pouvez configurer votre niveau de journalisation pour déboguer (une autre directive) et voir si vous obtenez l'erreur:
trouvés %2f (codée '/') URI (décodé='/url/http://www.url2.com'), de retour 404
autres erreurs non trouvées ne fournissez pas cette information dans les journaux. Juste un autre diagnostic...
Bonne chance (pour nous deux)!
remplacer %2F
par %252F
du côté du client.
C'est la forme à double codage de la barre oblique avant.
Alors, quand il atteint le serveur et obtient prématurément décodé, il décodera %2F qui est exactement ce que vous voulez.