2009-05-06 6 views
0

Voici mon fichier .htaccess:.htaccess avec GET params se heurtant

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* ?p=$0 

qui devrait rediriger vers mysite.com/?p=request que si request est pas un fichier. Mais, il correspond mal à une demande comme http://mysite.com/auth.php?openid.ns=http%3A%2F en raison du %2F (auth.php existe). Je ne comprends pas pourquoi ça fout les choses ... des idées?

Edit: Les gars, je mets l'accent sur %2F (ce qui est une barre oblique BTW) car il fonctionne très bien quand ce caractère est pas là

Pour être clair,

I obtenir un 404 pour cette page: http://mysite.com/auth.php?openid.ns=http%3A%2F

mais pas cette page: http://mysite.com/auth.php?openid.ns=http%3A


Juste pour info, j'ai vraiment vissé cette question. C'est une erreur 403 qui s'est produite à chaque fois que% 2F est apparu dans l'URL. Mon application a attrapé cette erreur et cracher un 404 trompeur qui pourrait être moins effrayant pour l'utilisateur final. Vraiment n'avait rien à voir avec .htaccess après tout. Plus de détails dans ma réponse ci-dessous.

+0

Vous pouvez activer des journaux de réécriture très verbeux et peut-être poster les parties pertinentes ici afin que nous puissions voir ce qui se passe pour un fait. – kch

+0

Puis-je activer le verbeux via .htaccess? Je suis sur un serveur partagé, je n'ai pas accès à tous les paramètres d'apache amusants (et je suis et apache n00b) – mpen

Répondre

0

N'était pas un problème AllowEncodedSlashes. Il frappait une règle mod_security qui interdit http:// dans les paramètres pour empêcher l'injection de fichiers. Ils l'ont ajouté à ma liste blanche.

0

pouvez-vous vous assurer que vous ne voulez pas dire ça?

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f 

pour tester ce que la valeur de la variable est, utiliser quelque chose comme:

RewriteRule (.*) http://www.google.com/?test=%{REQUEST_FILENAME} [L] 

si elle n'a pas cheminfichier complet à votre fichier auth.php, il ne sera pas le trouver . Je suis cette info ici:

http://mail-archives.apache.org/mod_mbox/httpd-bugs/200812.mbox/

+0

% {REQUEST_FILENAME} crache le nom de fichier complet,/home/username/public_html/mysite/auth – mpen

0

Il est probablement lié au fait que vous n'avez pas entre parenthèses dans votre regex si la capture ne se produit pas. Les travaux suivants pour moi:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ ?p=$1 [L,QSA] 
+0

Bien sûr que ça arrive; $ 0 est le tout. Testé pour être sûr. – mpen

3

Est-il possible que vous devez activer AllowEncodedSlashes, qui est désactivé par défaut? Lorsque cette directive est désactivée, les demandes contenant des caractères avant et arrière codés (% 2F et% 5C) sont refusées avec un 404.

Je me suis vaguement souvenu avoir vu ce problème dans MediaWiki, où toutes sortes de choses amusantes doivent être fait lors de l'échappement des titres et ainsi de suite, pour éviter les différents cock-up à différents niveaux de traitement des demandes. Il s'avère que beaucoup de choses dans les pays Apaches aiment se tromper avec PATH_INFO et autres, ce qui ne nous empêche pas de nous enfermer.

+0

Cela semble être le problème, mais lors de l'activation de AllowEncodedSlashes, il génère une erreur interne de 500 serveurs, même avec les règles de réécriture * no * :( – mpen

+0

Vérifiez le journal des erreurs Apache, quelle est l'erreur interne? Je pourrais aussi appuyer le conseil de kch ci-dessus, activer la journalisation de réécriture verbeuse et jeter un coup d'œil à la sortie du journal d'une requête qui a échoué pour voir ce qui se passe réellement. /mod/mod_rewrite.html#rewritelog contient des informations sur l'activation de la journalisation de réécriture – Rob

+0

L'utilisation de RewriteLog me donne aussi une erreur de serveur interne ... ma meilleure estimation est que les administrateurs l'ont désactivée Impossible de vérifier le journal d'erreurs apache sans contacter les admins non plus, je vais aller pleurnicher devant eux et voir ce qu'ils ont à dire – mpen

0

heureux que vous l'ayez compris avec votre hébergeur. avez-vous trouvé d'autres combinaisons de slash qui ont fonctionné et les confrontent à ce sujet? ;)

une réponse non-apache serait de ne pas passer la chaîne connue "http: //" dans le paramètre du tout.en regardant ma page de compte stackoverflow comme un exemple openID, il ne semble même pas stocker "http: //" du tout, juste "me.yahoo.com/a/swxth ....".

peut-être que c'est la vraie réponse. Si votre application s'attend à faire quelque chose en interne avec une URL "http", elle doit savoir l'ajouter au début au dernier moment responsable.

+0

Oui, sauf que mon application Web ne génère pas ces URL. Ils viennent de Google et Yahoo! et autres choses de ce genre; J'essaye d'implémenter le support d'OpenID comme le fait StackOverflow. Presque fini maintenant :) – mpen