Pourquoi RewriteCond% {REQUEST_URI} empêche la deuxième condition pas?

Premièrement, la règle qui fonctionne:

DirectoryIndex index.php
ErrorDocument 403 /form.html

RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule . - [F,L]

Ça veut dire

[url=http://example.com]http://example.com[/url]

et

[url=http://example.com/index.php]http://example.com/index.php[/url]

peut être ouvert uniquement à travers

POST

.

Maintenant le problème est

J'ai ajouté cet ensemble de règles supplémentaires:

RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]

Maintenant j'envoie à nouveau POST sur

[url=http://example.com]http://example.com[/url]

Mais obtenez cette erreur:

Forbidden

You don't have permission to access / on this server.
Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.

Cela n'a aucun sens, car la règle ne doit pas intercepter des demandes de

index.php

En envoyant 403, Mais bien, j'ai développé la deuxième règle comme suit:

RewriteCond %{REQUEST_URI} !^/form\.html$
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]

Et renvoyer à nouveau POST sur
http://example.com
Ne retourne pas 500, Mais je reçois toujours 403 ?!

Mettre à jour 1

Si je supprime le premier ensemble de règles, le second fonctionnera, comme prévu. Cela signifie seulement

[url=http://example.com]http://example.com[/url]

,

[url=http://example.com/index.php]http://example.com/index.php[/url]

et

[url=http://example.com/form.html]http://example.com/form.html[/url]

Vous pouvez accéder.

Mettre à jour 2

Si j'utilise les deux ensembles de règles et envoyer POST sur

[url=http://example.com/index.php]http://example.com/index.php[/url]

Je n'ai pas d'erreur ?!

Ainsi, les règles interfèrent uniquement si j'ai envoyé POST sur la racine URL. Mais pourquoi?
Invité:

Giselle

Confirmation de:

RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule . - [F,L]

En supposant que votre

DirectoryIndex

fixer

index.php

Et vous n'avez pas d'autres directives, alors ce sera votre premier bloc de règles qui mène à 403 Forbidden Quand accès

[url=http://example.com/]http://example.com/[/url]

. Le susmentionné permet aux demandes directes POST à

/index.php

.

DANS

RewriteRule

modèle

(Un point) Dans l'exemple ci-dessus, interdit le traitement des règles pour les demandes de

[url=http://example.com/]http://example.com/[/url]

. mod_dir Puis initie la sous-requête interne sur

/index.php

. Veuillez noter que cette sous-requête ressemble en fait à une demande interne. GET (Qu'est-ce que

REQUEST_METHOD

La variable de serveur est installée dans), Par conséquent, la condition ci-dessus (

!POST

) Avec succès, et la demande est finalement interdite.

Il serait préférable de canoniser la demande et de rediriger (308 - Redirection permanente avec la préservation de la méthode de la requête) Toute demande de

/index.php

à

/

. Ensuite, vous pouvez vous concentrer sur la comparaison seulement

/

et peut ignorer les sous-requêtes.

# Exception for error document (before other directives)
RewriteRule ^form\.html$ - [L]

# Canonicalise URL and remove "index.php" if requested
RewriteRule %{REDIRECT_STATUS} ^$
RewriteRule ^index\.php$ / [R=308,L]

# Only allow POST requests to the document root
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule ^$ - [F]

(Pas besoin de

L

Drapeau quand

F

Utilisé.

L

Membres.)

Avant de tester, assurez-vous que le navigateur est nettoyé. (Peut-être qu'il est préférable de vérifier avec

R=307

(Temporaire) Redirection pour éviter la mise en cache.)

RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]

Comme vous supposez que cela ne contredit pas les règles ci-dessus, cela correspond à quoi que ce soit, mais

/

et

/index.php

(En utilisant B.

.htaccess

). Ainsi, il interdit l'accès à toutes les autres URL, quelle que soit la méthode de la requête. (Comme mentionné ci-dessus, il semble que c'est la première règle qui a commencé 403 En accédant à K.

[url=http://example.com/]http://example.com/[/url]

.) Si vous avez inclus une exception pour vos documents d'erreur, comme décrit ci-dessus, vous n'avez pas besoin d'ajouter une condition supplémentaire.

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