2010-01-24 13 views
6

Mam problem z przepisaniem adresu URL do programu rozsyłającego fastcgi. Jeśli mogę zostawić tylko:pętle mod_rewrite nawet z flagą L

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

Spodziewałem L (ostatni przepis), aby wywołać tylko jeden przepisać. Zamiast tego zachowuje on ciągłość dispatch.fcgi, dopóki apache nie zgłosi błędu.

wiem, może być ustalona z:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

Ale to, co jest powodem, dla wielu przepisuje? Czy L robi coś innego, niż sądzę?

Odpowiedz

7

Wiem, że to stare pytanie, ale dla innych poszukujących realna odpowiedź, tutaj jest:

Flaga [L]CZY pracę w .htaccess plików. Informuje, że rewrite module pomija wszystkie poniższe reguły w tym konkretnym pliku .htaccess. Wykonuje swoją pracę, Apache przepisuje adres URL i opuszcza plik .htaccess.

Jednak na końcu pliku .htaccessJeśli URL żądania został przepisany, cały proces dopasowywania URL rozpoczyna się ponownie z nowym adresem.

To co się dzieje powyżej ^(.*)$ będzie zawsze dopasować aktualny adres URL, powoduje nieskończoną pętlę, tylko opcja maxredirect przepisać (domyślnie 10) zatrzymuje ją.

Test atrybut !-f plik (jak wspomniano przez pytającego) będzie rozwiązać problem, ponieważ URL będzie pasował prawdziwe nazwy pliku!

RewriteCond% {REQUEST_FILENAME} -f

RewriteRule^(. *) $ Wysyłka.fcgi/$ 1 [L, QSA]

teraz, jeśli poprosimy http://example.com/toappend, .htaccess przepisuje go do dispatch.fcgi/toappend i nie pętla przepisać stanie.

+0

Dlaczego to jest, gdy robię 'rewriterule. */Index.php' , istnieje nieskończona pętla, ale jeśli zrobię 'rewriterule. * index.php', to nie ma pętli? – Pacerier

+0

Ok, znalazłem ans i zapisałem to tutaj – Pacerier

2

Najwyraźniej - i tylko to czytam tutaj, nie mam żadnej wiedzy z pierwszej ręki - dyrektywa [L] nie działa w plikach .htaccess, tylko jeśli jest w pliku .conf.

Zob Hidden features of mod_rewrite

w .htaccess kontekście, [l] będzie nie zmuszają mod_rewrite do zatrzymania. będzie nadal powodować wewnętrzną

+0

Myślę, że odpowiedzi na http://stackoverflow.com/questions/1775877/ też - niestety ta prawdziwa odpowiedź nie została tam oznaczona ... – viraptor

6

Hy, dodać to po RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 

.. i to powinno działać pętle zatrzymywane.