2013-04-26 11 views
5

Mam spojrzał na tych rozwiązań i żaden z nich faktycznie pracują poprawnie na mojej stronie:mod_rewrite usunąć rozszerzenie .php i zachować parametry GET

mod_rewrite to remove .php but still serve the .php file?

How to remove file extension from website address?

How to use Apache Mod_rewrite to remove php extension, while preserving the GET parameters?

i po prostu nie robią tego, co jest mi potrzebne:

1) usuń rozszerzenie .php z plików i zamiast /index.php display/index

2) zachowaj parametry GET (które odczytuję i przechowuję w ciasteczkach sesji podczas ładowania pliku, w nagłówku), więc zamiast /index.php?a=1 & b = 2 wyświetlać może/index/a1/b2

3) pracować nad subdomenami i https: // bez zmieniania adresu URL całkowicie lub kończąc w nieskończonej pętli lub coś ...

Czy ktoś ma pojęcie, w jaki sposób połączyć te zasady, aby prawidłowo pokryły 3 punkty powyżej?

To co ja pracuję jako punkt wyjścia:

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

opublikować treść Twojej .htaccess tutaj –

+0

aktualizacja z mojego punktu wyjścia .htaccess –

+0

Jaki problem należy rozwiązać za pomocą kodu, który napisałeś? – showdev

Odpowiedz

6

Widzisz to na odwrót. Nie chcesz przekierowywać żądań dla pliku .php do czystego adresu, ponieważ nigdy nie chcesz, aby użytkownik zobaczył .php w pierwszej kolejności. Zamiast tego należy wykonać żądanie, które nie kończy się na .php, a następnie sprawdzić, czy plik (pod powierzchnią) rzeczywiście ma rozszerzenie .php. Następnie, jeśli tak jest, zmodyfikuj żądanie, aby dodać rozszerzenie .php, aby użytkownik nigdy nie musiał widzieć rozszerzenia.

wykonaj następujące czynności:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /$1.php [QSA] 

Kontrole RewriteCond, aby zobaczyć, czy wniosek (dołączona na końcu ścieżki DOCUMENT_ROOT) tworzy poprawną nazwę, kiedy zostanie dodane „.php” na końcu tego . Jeśli tak, to RewriteRule może po cichu przerobić żądanie, aby ".php" zostało dodane do ścieżki żądania. Flaga QSA informuje mod_rewrite, aby dołączyła istniejący ciąg zapytania do końca nowej ścieżki żądania, więc zmienne GET powinny zostać zachowane.

Należy zauważyć, że DOCUMENT_ROOT może już nie mieć ukośnika, więc może być konieczne pozbycie się ukośnika przed $1 w RewriteCond.

Jeśli chodzi o parametry ciągu zapytania, mod_rewrite nie może obsłużyć nieokreślonej liczby zmiennych, więc musisz podać jawny wzór żądania w pytaniu, zanim rozwiązanie mod_rewrite może zaoferować sposób odwzorowania go na ciąg zapytania.

3

Włącz mod_rewrite i .htaccess przez httpd.conf a następnie umieścić ten kod w swoim katalogu .htaccess pod DOCUMENT_ROOT:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

## hide .php extension 
# To externally redirect /dir/foo.php to /dir/foo 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] 
RewriteRule^%1 [R=302,L] 

# To internally forward /dir/foo to /dir/foo.php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*?)/?$ $1.php [L] 

Po zweryfikowaniu to działa poprawnie następnie zmienić R=302 do R=301. (Unikaj używania R=301 (Permanent) podczas testowania reguł mod_rewrite).

+0

Myślałem, że to doprowadzi do nieskończonej pętli. Czy THE_REQUEST pozostaje niezmieniony przez ciche zapisywanie? – Bobulous

+2

@Arkanon: Tak, to prawda, że ​​'THE_REQUEST pozostają niezmienione'. THE_REQUEST reprezentuje oryginalny niezmieniony wiersz zapytania, który serwer Apache otrzymuje z przeglądarki. – anubhava

+0

Poręczna wskazówka. Muszę o tym pamiętać. – Bobulous

0

Spróbuj wykonać następujące czynności:

RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" 
RewriteRule .* - [L,R=404] 
+1

Proszę wyjaśnić nieco, jak ten kod ma działać – rayryeng

Powiązane problemy