Dynamicznie generowane .htm, czyli mod_rewrite z przyległościami typu FCKeditor

02-05-2007 at 10:05 | In php, webmastering |

Tytułem przedmowy

‘Wracam’ po dłuższej przerwie, mam nadzieję, że na stałe (czyt. regularnie). Nowa praca, nowe sprawy na głowie etc - wiadomo ;). Będę się starał się mniej o polityce, a bardziej o czymś przydatnym. Zatem:

Problem

Jakiś czas temu przy tworzeniu kolejnej strony zapragnąłem mieć bardziej przyjazne linki. Należałoby zadać pytanie - co znaczy ‘przyjazne’? Odpowiedź jest prosta - takie, które nie są nieprzyjazne ;). Te z kolei to koszmarki, które przeciętny internauta widzi na codzień: index.php?page=0&prawa=0&strona=comment&go=355, bądź index.php?option=com_content&task=view&id=52&Itemid=84 i wiele innych linków tego typu, których miliardy w odmętach internetu. Link w takiej formie wielce niepraktycznym jest - nawet jesli zawiera w sobie faktyczną nazwę strony, do której prowadzi, jest ona zakopana w gąszczu znaków zapytania, ampersandów, cyfer i innych dziwnych znaczków. Jakże lepiej zamiast linku typu index.php?pageId=34&sort=3&order=1&userId=18, wyglądałoby coś w stylu uzytkownicy,3,1,18.htm, badz nawet uzytkownicy/stefan.htm? Poza oczywistymi walorami prezentacyjnymi (adres strony mowi cos o jej zawartości), dokumenty zwracane przez serwer w takiej postaci sa znacznie bardziej lubiane przez wyszukiwarki.

Ale jak to tak to?

Pierwsza myśl przechodząca prawdopodobnie przez głowę osoby zielonej w tym temacie to ‘kurczę blade, motyla noga, przecież nie będę tworzyć tysięcy statycznych plików HTML, żeby linki mieć ładniejsze. Od tego mam PHP, żeby samo się to robiło’. Rozumowanie jak najbardziej słuszne, ale ubogie o znajomość kilku sztuczek, a przynajmniej jednej poważnej. Mowa oczywiście o wspaniałym mod_rewrite z Apache’a. Po obszerniejsze informacje zapraszam na google. Z podstawowych rzeczy, które należy wiedzieć, wypada wspomnieć o konieczności włączenia w apache’u owego cudeńka. W httpd.conf musi się znaleźć dyrektywa LoadModule rewrite_module modules/mod_rewrite.so - w praktyce należy odhashować odpowiednią linijkę i tyle ;].

A dalej i konkretniej?

Oczywiście samo włączenie dyrektywy Apache’a to jednak trochę za mało, by się cieszyć superfajoskimi adresami. Kluczem do sukcesu jest stworzenie w katalogu głównym danej strony pliku .htaccess, w którym to należy wpisać RewriteEngine On. Dalej przychodzi czas na ustawienie danych reguł. Tutaj przyda się podstawowa znajomość wyrażeń regularnych oraz oczywiście wyobraźnia. To pierwsze, by wiedzieć, co się robi, a drugie - by zrobic to z sensem. Osobiście preferuję linki w postaci nazwaStrony,arg1,arg2.htm, ale jak ktoś woli może kombinować do woli z konfiguracjami typu nazwaStrony/arg1/arg2, co mi niekoniecznie się podoba, ale np. adres w postaci nazwaKategorii/nazwaStrony.htm sens już jakiś ma ;). Ok, tyle w teorii, w praktyce przykładowy plik .htaccess może wyglądać tak:

RewriteEngine On
RewriteRule ^([^-]+),([^-]+).htm$ index.php?page=$1&pageNo=$2 [L]
RewriteRule ^([^-]+).htm$ index.php?page=$1 [L]
RewriteRule ^([^-]+).htm_([^-]+)$ index.php?page=$1&sort=$2 [L]

(ścięło trochę, ale w kodzie strony całość :P)
Najczęściej używana reguła to oczywiście ta druga. Przekazuje ona do pliku index.php zmienną $_GET['page'] o wartości nazwy pliku .htm. Co dalej zrobi z tym index.php, to sprawa programisty :).

Uwagi

Przypadki szczególne to wszystko, co na stronie może wysyłać żądania do prawdziwych plików HTML. W praktyce wszelkie iframe’y, możliwe, że i skrypty AJAXowe. W jeszcze większej praktyce, problemy może robić np. FCKeditor, który z mieszczęsnego iframe’a korzysta. Problem trudnym nie jest - należy się zdecydować, czy “mod_rewrite’ować” .htm, czy też .html. Choć ten drugi ładniej wygląda, częściej sprawia problemy ;) - FCKeditor korzysta z plików o właśnie takim rozszerzeniu. Ustawiając dyrektywę na chwytanie .htm, problemów jak do tej pory nie mam :].

Liczba komentarzy: 4 »

Wątek RSS dla komentarzy do tego wpisu. Adres TrackBack

  1. hmm, co do konfigu Apache’a to wszystko zależy od wersji. W 2.x to się robi dowiązanie symboliczne do modułu i śmiga ładnie.

    Dalej, czemu zaraz ograniczać się do końcówek .htm? Bo tak wychodzi z twojego wpisu, że tylko tak się da;p A przecież regexpy to potęga maksymalna.

    Dopisz też coś o RewriteCond, RewriteBase, o flagach dla przepisań, albo daj lina do dokumentacji apache’a bo tam jest wszystko:)

    Komentarz autor rozbit — 02-05-2007 #

  2. Większość hostingów ma obecnie i tak włączone mod_rewrite, a sposób przeze mnie podany na pewno działa pod windą - zakładam, że jak ktoś stawia sobie całe środowisko na linuchu, to wie już, co z czym ugryżć, natomiast większość okienkowców instaluje krasnala, czy innego wampa, nie mając żadnego pojęcia, co i jak…

    Do końcówek .htm nie trzeba koniecznie się ograniczać, ale nie widzę sensu, żeby się ograniczać do czegokolwiek innego ;) - dokument HTML’owy winien mieć rozszerzenie .htm, bądź .html. No, chyba, że ktoś chce robić innym psikusy, albo chce móc totalnie skontrolować działania usera (dzięki choćby wspomnianemu RewriteCond) ale nie o to mi raczej idzie, a o prostą estetykę :P

    Więcej (w tym imo nieco toporną dokumentację Apache’a) można znaleźć w googlach, do czego link dałem.

    Komentarz autor scary — 02-05-2007 #

  3. w Krasnalu domyślnie działa mod_rewrite i to nawet nieźle;)
    Co do rozszerzeń, owszem dokument HTML powinien mieć, ale przecież podając adres, nie wskazujesz koniecznie na dokument HTML ;)
    Ja mod_rewrite używam nie tylko dla estetyki ale raczej dla walorów bezpieczeństwa (zabezpieczenie przed hotlinkowaniem, “ukrywanie” prawdziwych ścieżek do plików/katalogów itp). Wiadomo, jak ktoś się uprze to wszędzie dojdzie, ale po co ułatwiać życie?:)

    Komentarz autor rozbit — 02-05-2007 #

  4. Wiesz, o samym mod_rewrite można się rozpisać na cały blog ;). Swoją drogą, wiele z tego da się rozwiązać korzystając z innych środków (najprędzej z PHP). Wpis ma raczej charakter typu ‘dla opornych’ (większośći ;]), bo kto chciał, to i tak sobie zrobił, co chciał i jak chciał :P

    Komentarz autor scary — 02-05-2007 #

Dodaj komentarz

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog at WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.