Porównaj ceny domen i usług IT, sprzedawców z całego świata

Dlaczego RewriteCond% {REQUEST_URI} koliduje z drugim warunkiem NIE?


Najpierw zasada, która działa:
DirectoryIndex index.php
ErrorDocument 403/form.htmlRewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule . - [F,L]

To znaczy
       [url=http://example.com]http://example.com[/url]
i
       [url=http://example.com/index.php]http://example.com/index.php[/url]
można otworzyć tylko przez
       POST
.

Teraz problem

Dodałem ten dodatkowy zestaw reguł:
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]

Teraz PUBLIKUJĘ ponownie do
       [url=http://example.com]http://example.com[/url]
ale otrzymaj ten błąd:
ForbiddenYou 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.

To nie ma sensu, ponieważ reguła NIE powinna przechwytywać żądań dla
       index.php
wysyłam 403 ale ok, drugą regułę rozszerzyłem następująco:
RewriteCond %{REQUEST_URI} !^/form\.html$
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]

I znowu, wysyłając POST do

http://example.com
http://example.com
nie zwraca 500, ale nadal otrzymuję 403 ?!

Zaktualizuj 1
Jeśli usunę pierwszy zestaw reguł, drugi będzie działał zgodnie z oczekiwaniami. To tylko oznacza
       [url=http://example.com]http://example.com[/url]
,
       [url=http://example.com/index.php]http://example.com/index.php[/url]
i
       [url=http://example.com/form.html]http://example.com/form.html[/url]
można uzyskać dostęp.

Zaktualizuj 2
Jeśli użyję obu zestawów reguł i wyślę POST do
       [url=http://example.com/index.php]http://example.com/index.php[/url]
Nie otrzymuję żadnych błędów ?!
Więc reguły wchodzą w drogę tylko wtedy, gdy POST do głównego adresu URL. Ale dlaczego?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule . - [F,L]
Zakładając, że twój
         DirectoryIndex
ustawiony na
         index.php
i nie masz innych dyrektyw, to będzie twój pierwszy blok reguł, który spowoduje 403 zabroniony dostęp
         [url=http://example.com/]http://example.com/[/url]
... Powyższe zezwala tylko na bezpośrednie żądania POST do
/index.php
.
W
         RewriteRule

szablon

(pojedyncza kropka) w powyższym przykładzie zapobiega przetwarzaniu reguły dla żądań do
         [url=http://example.com/]http://example.com/[/url]
... mod_dir następnie inicjuje wewnętrzne żądanie do
/index.php
... Zwróć uwagę, że to żądanie podrzędne faktycznie wygląda jak wewnętrzne żądanie GET (czyli
         REQUEST_METHOD
zmienna serwera jest ustawiona na), więc powyższy warunek (
         !POST
) kończy się sukcesem, a żądanie zostaje ostatecznie odrzucone.
Byłoby lepiej, aby kanonizować żądanie i przekierowywać z zewnątrz (308 to trwałe przekierowanie z zachowaniem metody żądania) każde żądanie dotyczące
/index.php
do
/
... Wtedy możesz skupić się tylko na dopasowywaniu
/
i może ignorować podzapytania.
# 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]

(Nie ma potrzeby
         L
Zgłoś kiedy
         F
używany.
         L
ukryty.)
Przed testowaniem upewnij się, że pamięć podręczna przeglądarki została wyczyszczona. (Lepiej jest to sprawdzić
         R=307
(tymczasowe) przekierowania, aby uniknąć buforowania).

RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]
Jak zakładasz, nie jest to sprzeczne z powyższymi zasadami, pasuje do wszystkiego innego niż
/
i
/index.php
(gdy jest używany w
         .htaccess
). W związku z tym odmawia dostępu do wszystkich innych adresów URL, niezależnie od metody żądania. (Jak wspomniano powyżej, wygląda na to, że jest to pierwsza reguła, która uruchomiła 403 podczas uzyskiwania dostępu
         [url=http://example.com/]http://example.com/[/url]
.) Jeśli załączyłeś wyjątek dla swoich dokumentów błędów, jak powyżej, nie musisz dodawać dodatkowego warunku.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się