2013-03-28 12 views
5

chciałbym dostać ten ostateczny URL:.htaccess najlepszych praktyk

'idealnego url'

domain/services/city/name/ 

z adresem URL:

'prawdziwe url'

domain/page.php?s=services&c=city&a=name 

ten powinien działać zarówno wtedy, gdy użytkownik wpisze "idealny" adres URL i kiedy kliknie "prawdziwy" URL z przycisku.

Chciałbym, żeby to działało również z domain/services/ jako domain/page.php?s=services lub domain/services/city/ jako domain/page.php?s=services&c=city.

Nie pytam kodu, ale jaka jest najlepsza praktyka, aby osiągnąć ten wynik.

Czy powinienem używać tylko htaccess i pisać polecenia dla każdego przypadku, czy też muszę zrobić coś innego?

+0

Przysłowie, którym posługiwałem się od lat przy tworzeniu reguł przepisywania, jest jak CSS, dopasuj najbardziej specyficzny (najdłuższy) pierwszy. To może nie być najbardziej "słuszne", ale dobrze mi służyło. – Uberfuzzy

Odpowiedz

0

Możesz przenosić logikę decyzji, w pewnym sensie na dyspozytora po stronie php. W htacess przekieruj dowolne nieistniejące adresy URL według jakiegoś wzorca do jakiegoś /index.php?url=$bla lub /rewrite.php?url=$bla

Następnie dołącz stamtąd swój kod. W ten sposób działa większość frameworków.

Główny problem polega na tym, aby ignorować 100% non-kod php, jak nie-istniejących obrazów, CSSS, JavaSkrypty, itp

1

Najlepszym rozwiązaniem będzie napisać parser zapytań. Zobacz przykłady w przykładowej strukturze TinyMVC lub serach google dla routera, kontrolera front, dispatchera itp.

Może być trudno osiągnąć, ponieważ masz niestandardowe nazwy parametrów, takie jak "c" i "a". Więc trzeba napisać jakąś mapę, która będzie przypisywać ludzkich nazw parametrów czytelny dla nazw zmiennych jak:

'city' => 'c' 
'name' => 'a' 

Twój parsera zapytanie może również automatycznie przypisać zmienne w pewnym sensie jak:

/domain/services/c=london/n=peter/ 

Ten rodzaj Dyspozytor może uruchamiać wszystkie linki, jeśli zmienisz wszystkie żądania do jednego pliku php w pliku .htaccess (zazwyczaj index.php), wyłączając obrazy, swf, css, js itp.

To Twoja decyzja, jak zaplanować routing URL-ów logika. Pamiętaj o kodowaniu znaków specjalnych dla ante URL.

Należy rozważyć uzyskanie wartości parametrów w porządku numerycznym, takich jak "pierwszy parametr", "drugi parametr", aby utworzyć uniwersalny wzór adresu URL, taki jak/moduł/akcja/parametr1/parametr2, itd. Tak więc zawsze można uzyskać parametr według numeru, niezależnie od jego nazwy.

Oczywiście można pisać polecenia w htaccess, ale byłoby to problematyczne przy dodawaniu nowych akcji.

Jeśli chcesz podnieść te "idealne" adresy URL, nawet jeśli użytkownik kliknie link, prześle formularz itp., Możesz nie tylko zmienić .htaccess lub wpisać router.Trzeba też zmienić linki/działań w kodzie lub napisać do budowania adresów URL jak

<a href="<?php buildUrl('modulke' , 'action' , 'param1' , 'param2'); ?>">aaaa</a>

0

Musisz użyć .htaccess z kursu, jest droga.

regułę, która będzie:

RewriteEngine On 

<IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteRule ^([^/.]+)/([^/.]+)/([^/.]*)?$ page.php?s=$1&c=$2&a=$3&%{QUERY_STRING} 
    </IfModule> 
1

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

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

# redirects /page.php?s=services&c=city&a=name to /services/city/name/ 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+page\.php\?s=([^&]+)&c=([^&]+)&a=([^&]+) [NC] 
RewriteRule^/%1/%2/%3? [R=301,L] 

# forwards /services/city/name/to /page.php?s=services&c=city&a=name 
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /page.php?s=$1&c=$2&a=$3 [L,QSA] 

PS: Należy pamiętać, że powyżej zasady zajmują się tylko URI /services/city/name/. Aby obsłużyć /services/city/ i /services/ trzeba będzie dodać podobny zestaw reguł (1 przekierowanie do przodu i 1 dla każdego URI; iść z najbardziej specyficzna wobec najbardziej ogólne)

0

http://www.addedbytes.com/articles/for-beginners/url-rewriting-for-beginners/ ma wszystkie odpowiedzi, których szukasz, aby rozpocząć.

Jak stwierdzono @Uberfuzzy, najlepszym rozwiązaniem jest, aby określić najbardziej specyficzny pierwszy tak:

RewriteRule ^domain/services/city domain/page.php?s=services&c=city [NC,L] 
RewriteRule ^domain/services/  domain/page.php?s=services   [NC,L] 

Będziesz zazwyczaj trzeba użyć htaccess i zapisu poleceń dla każdego przypadku. Wyjątek stanowi sytuacja, gdy używasz frameworka (Zend Framewor) lub innego narzędzia obsługującego ponowne pisanie adresu URL.

Powiązane problemy