2012-09-01 10 views
5

Próbowałem usunąć rozszerzenia PHP z mojej witryny. Gdy użytkownik zażąda pliku PHP, PHP zostanie usunięte, a użytkownik zostanie przekierowany, a gdy użytkownik wpisze adres URL bez PHP, zostanie dostarczony rzeczywisty plik PHP. To działało dobrze, chyba że w adresie URL znajduje się parametr GET. Moje zasady są jak poniżej:Jak używać Apache Mod_rewrite do usuwania rozszerzenia php przy zachowaniu parametrów GET?

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

# remove trailing slash ONLY if it is not an existing folder 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

# rewrite to FILENAME.php if such file does exist and is not a folder 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ /$1.php [L,QSA] 

myślałem, że to powinno już być w stanie usunąć nawet gdy php istnieje jakikolwiek parametr GET, ale nie udało się. Próbowałem także coś takiego:

RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA] 

To też nie zadziałało, php nadal tam jest. Ale gdy próbuję:

RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA] 

czyli usunięcie RewriteCond, rozszerzenie php zostanie usunięty i parametry zostały zachowane, ale strona nie będzie służył jako przeglądarka mówi było zbyt wiele przekierowań.

Czy ktoś ma jakieś pomysły?

Odpowiedz

0

Możesz chcieć użyć parametru %{QUERY_STRING} udokumentowanego jako here.

Przydatne czytanie here i here.

2

Dziękuję SteAp za odpowiedź. Zdarzyło mi się, że udało mi się znaleźć sposób, aby poradzić sobie z tym właśnie teraz i chciałbym się z nami podzielić na wypadek, gdyby inni mieli podobne problemy.

W moich zasad, mam

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

Aby wykonać zewnętrzne przekierowanie, gdy użytkownik zażąda plik PHP. RewriteCond ma na celu zapobieganie pętlom przekierowań - tj. Niekończące się przekierowanie z powodu niewłaściwego wewnętrznego przepisywania i zewnętrznego przekierowania (usunięcie php, dodanie php, a następnie ponowne usunięcie, ...)

Gdy występują parametry, rzeczywisty nagłówek pochodzi jako http://domain.com/file.php? .... HTTP/1.1 Coś takiego, więc wzorzec w RewriteCond nie będzie działał, ponieważ nie bierze pod uwagę parametrów.

Aby go rozwiązać, po prostu zastąpić powyższy kod z:

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

Dzięki temu parametry mogą być dopasowane do wzoru, a teraz wszystko działa.

nadzieję, że pomoże ktoś mający podobny problem

+0

w RewriteRule (czy jest to tylko noob jak ja lol?):/1 $ generować niedziałający link, użyj $ 1 Przy out / – StefanoCudini

Powiązane problemy