2009-01-31 13 views
9

Próbuję utworzyć czyste adresy URL w mojej witrynie. Teraz udało mi się skonfigurować apache, więc każde żądanie, takie jak mysite.com/page będzie działać. Ale chcę również, aby żądania dotyczące mysite.com/page.php zostaną przekierowane na stronę mysite.com/page. Mam ustawić zmienną środowiskową w .htaccess, aby sprawdzić, czy ja już przekierowany aby zapobiec pętli, ale wciąż je ... Oto .htaccess:Wyczyść przekierowanie adresu URL

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 

RewriteEngine On 
RewriteBase/

# set the variable 
RewriteRule ^$ - [L] 
RewriteRule ^(.*)$ $1 [E=REWROTE:0] 

# this works fine 
# make mysite.com/page work and set REWROTE variable to 1 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1] 

# but if i enable this, i get redirected and then stuck in a loop 
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1 
#RewriteCond %{ENV:REWROTE} !^1$ 
#RewriteRule ^(.*)\.php$ $1 [R=301,L] 

Dzięki!

+0

Witamy na przepełnienie stosu. Dziękuję za wyraźne sformułowanie Twojego pytania, podanie kodu i pokazanie, co działa, a co nie. Jeśli masz przydatne informacje w dziennikach apache, opublikuj to również. Czasami problemy z przekierowaniem stają się bardziej oczywiste, gdy widzisz dzienniki. –

+0

Niestety nie mam dostępu do tego rodzaju informacji. – oxeleo

Odpowiedz

14

Dodaj tę regułę powyżej istniejących reguł przepisywania zatrzymać przekierowanie jeśli wniosek został już przekierowany raz (ref):

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

Bingo! Działa jak urok i nie ma potrzeby zmiany zmiennej środowiskowej. – oxeleo

1

Można sprawdzić linię Prośba o co działo pierwotnie zażądano:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ] 
RewriteRule \.php$ %1 [R=301,L] 

Aha, a pierwszy argument z RewriteCond directive nie jest wyrażeniem regularnym, ale zwykłym ciągiem znaków. Więc ucieczka przed . jest zła.

+0

Dzięki, to zadziałało dla mnie :) –

0

Czy jest jakiś powód, dla którego nie można użyć znaku końca końca łańcucha, $?

RewriteRule ^/(.+)\.php$ /$1 

przekieruje /page.php do/strony, ale nie zrobi żadnej przekierowanie na stronę /.

Zasadniczo stosowanie takich technik, jak ustawianie zmiennych środowiskowych i dodawanie sprawdzeń do REDIRECT_STATUS, nie będzie bardzo niezawodne.