2017-02-19 1 views
1

Utilisation de .htaccess Je souhaite transformer% {PATH_INFO} en un paramètre de chaîne de requête pour l'amorçage. Mais je veux empêcher les visiteurs d'entrer manuellement le paramètre bootstrap.Suppression de certains paramètres de chaîne de requête SAUF si elle a été ajoutée par réécriture

Donc, c'est entré URL: www.example.com/user/pictures?id=65

affiche fait: www.example.com?bootstrap=/user/pictures & id = 65

MAIS si manuellement entré

Cette URL: est entrée www.example.com?bootstrap=/user/pictures & i d = 65

éradique: www.example.com?id=65

Ou affiche une erreur: 404: not found

Meilleur scénario

manuellement bootstrap entré est ignoré ET% {PATH_INFO} devient un nouveau paramètre.

donc ceci: www.example.com/user/pictures?id=65 & bootstrap = somecrap

Affiche: www.example.com?id=65 & bootstrap =/user/images

Il existe deux raisons pour bloquer un paramètre bootstrap saisi manuellement. 1) Sécurité. Nous ne voulons pas que les utilisateurs fassent la chasse aux fichiers qui ne sont pas destinés à être affichés. 2) Les conflits. Nous ne voulons pas choisir entre un bootstrap saisi manuellement et le% {PATH_INFO} correct.

La suppression du paramètre bootstrap est facile. Quelque chose comme ...

RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

Ajouter le paramètre est facile. (Le mien est plus compliqué, mais cela montre l'idée.)

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI}%{PATH_INFO} (.*?)(/.+)\2$ 
RewriteRule ^(.*)$ /%1?bootstrap=%2 [QSA,L] 

Si htaccess juste couru à travers une fois, ces deux extraits feraient l'affaire. Mais à la place, htaccess redémarre après chaque réécriture et mon paramètre bootstrap ajouté est à nouveau supprimé.

Je sais que le correctif quick-n-dirty serait d'ajouter [END] à la deuxième règle, mais cela ne marchera pas ici.

Ce dont j'ai besoin est un moyen de supprimer? "Bootstrap = xxx" UNIQUEMENT de la demande originale et non de la demande réécrite.

Merci

Répondre

3

Reconnaître, si cela est la demande initiale ou non, vous pouvez vérifier certaines REDIRECT_ des variables

REDIRECT_ environment variables are created from the environment variables which existed prior to the redirect. They are renamed with a REDIRECT_ prefix, i.e., HTTP_USER_AGENT becomes REDIRECT_HTTP_USER_AGENT .

REDIRECT_URL , REDIRECT_STATUS , and REDIRECT_QUERY_STRING are guaranteed to be set, and the other headers will be set only if they existed prior to the error condition.

Donc, dans votre cas, vous pouvez vérifier REDIRECT_STATUS ou REDIRECT_QUERY_STRING pour voir, si cela est un externe ou interne demande.

Supprimer bootstrap= que, si cela est une demande externe, à savoir REDIRECT_QUERY_STRING est vide

RewriteCond %{REDIRECT_QUERY_STRING} ^$ 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

L'autre façon serait similaire, mais maintenant vérifier si les variables est pas vide, par exemple

RewriteCond %{REDIRECT_QUERY_STRING} . 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

Vous pouvez également vérifier une valeur spécifique, si cela est approprié.

+0

Très bon usage de 'REDIRECT_QUERY_STRING' ++ – anubhava

2

La façon de le faire est de définir une variable d'environnement sur une ré-écriture réussie, que vous pouvez faire avec le drapeau E.Donc, quelque chose comme ceci:

RewriteRule ^example$ ?param=example [E=rewritten:1] 

Vous pouvez alors vérifier dans une condition:

RewriteCond %{ENV:rewritten} !=1 

Ou:

RewriteCond %{ENV:rewritten} =1 

Cependant, lorsque vous utilisez ce en .htaccess vous devez être prudent , car si le passage à travers le fichier .htaccess se termine et qu'une redirection interne est générée, toutes les variables d'environnement générées obtiendront REDIRECT_ o eux. Donc, pour Subséquemment à travers, vous devez également vérifier que, dans la plupart des cas, ou tout simplement pour que, si vos règles sont ci-dessus où vous ajoutez la variable d'environnement:

RewriteCond %{ENV:REDIRECT_rewritten} !=1 

Ou:

RewriteCond %{ENV:REDIRECT_rewritten} =1 

référence: