Postaram się wyjaśnić zagadnienia szczegółowo, by każdy zrozumiał.
Będę zadawał pytania oznaczone numerami - 1), 2)...
== Kompatybilność ==
Dotychczasowe adresy w stylu index.php?co=modul&act=send w wersji
krótkiej mogą wyglądać tak: /modul/send. Prawda, że czytelniejsze?
Rezygnując jednak ze starej postaci URL-ów należałoby zerwać
kompatybilność. Nie do końca. Można napisać konwerter starych adresów,
który zamieni je na nowe.
== Dobrze, ale jeśli brakuje mod_rewrite? ==
Przecież zostanie tylko stary format URL. Jak w takim razie
wygenerować odnośnik do innej podstrony? Można tak:
$url = (MOD_REWRITE) ? '/modul/send' : '?co=modul&act=send';
A może istnieje sposób na implementację krótkich URL na serwerach bez
mod_rewrite? Wpadłem na pomysł, aby wykorzystać system plików. Na
pewno w CMS-ach taka metoda jest od dawna wykorzystywana, choć jeszcze
nie spotkałem się z tym.
Gdy nadchodzi żądanie do /modul/send, CMS próbuje znaleźć plik send w
folderze modul. Zawiera tylko komendy startowe i ewentualnie cache
niektórych elementów bądź zapytań z bazy danych.
chdir('..');
/* budowanie tablicy $URL i inne operacje */
require 'index.php';
== A może inny separator? ==
Aby uniknąć problemu ze zmianą bieżącej ścieżki w przeglądarce, część
skryptów zamiast / dzieli składniki URL za pomocą innego znaku, np.
przecinka. Rozważmy przykład: jesteśmy na stronie domena.com/modul/
send. W menu są odnośniki do innych stron, np. innastrona.html. Po
kliknięciu linku strona nie otworzy się, gdyż przeglądarka przekieruje
do domena.com/modul/innastrona.html zamiast domena.com/
innastrona.html.
Gdy wykorzystamy inny separator - domena.com/modul,send - powyższy
problem nie wystąpi. Jednak obawiam się, czy idea oparcia krótkich URL
na systemie plików wypali. Główny katalog będzie musiał mieć prawa
zapisu.
Wróćmy do standardowego separatora - czyli ukośnika / - można
rozwiązać problem na 2 lub więcej sposobów. Podam od razu ich zalety i
wady.
A. Znacznik <base>
Określa katalog bazowy. Dobre rozwiązanie, gdy w kodzie HTML i CSS są
URL-e względne, np. img/obraz.png, lib/js.js.
B. Ścieżki bezwzględne
Należy rozpocząć każdy URL od ukośnika, np. /img/obraz.png, /lib/
js.js. Co wtedy, gdy witryna znajduje się w podkatalogu, np.
jakishosting.com/twoja_strona? Wtedy ścieżki będą wyglądać tak: /
twoja_strona/obraz.png, itd.
== Implementacja krótkich URL w PHP ==
Zamiast definiować wiele reguł w .htaccess i przerabiać je na formę ?
co=modul&act=send, można przekierować wszystkie żądania (które nie
odnoszą się do istniejących plików) do strony: index.php?url=modul/
send. Teraz łatwo pociąć URL:
$URL = isset($_GET['url']) ? explode('/',$_GET['url']) : array('');
Teraz wykorzystujemy tablicę numeryczną $URL do wyświetlenia
odpowiedniego modułu.
== Elastyczność ==
Cel: brak problemów przy przenosinach serwisu na inny serwer,
nieutrudnianie życia redaktorom strony... Nie każdy może pamiętać lub
chcieć podawać wszędzie ścieżki bezwzględne (zaczynać od /). Może
nawet nie będzie rozumiał / wiedział.
== Indeks URL ==
CMS oferuje wiele modułów. Można go rozszerzać za pomocą rozszerzeń.
Domyślnie oferuje 5 typów treści: artykuły, pliki, multimedia, linki i
nowości. Dodajmy jeszcze inne elementy, które mają TYTUŁY: kategorie,
ankiety...
Najprościej tworzyć takie URL-e dla treści:
/artykul/50, /plik/99, /50 (kategoria)
albo takie:
/artykul/skrocony-tytul, /tytul-kategorii (kategoria)
Można jeszcze bardziej skrócić URL-e, stosując globalny indeks
skróconych tytułów. Nie wiem, czy wszyscy będą w stanie zrozumieć,
czym jest skrócony URL, jeśli zobaczą takie pole w formularzu - nawet
mimo wyjaśnień. Nic nie stoi na przeszkodzie, aby generować je
automatycznie.
domain.com/tytul-artykulu, domain.com/tytul-pliku, domain.com/tytul-
kategorii
Możliwe konflikty:
A. Ten sam tytuł w różnych wersjach językowych strony - może to być
tytuł skryptu lub programu. Zdaje się, że łatwo go obejść - skrypt
wczyta artykuł / plik / ... dla używanego języka (jeśli istnieje).
B. Te same tytuły dla różnych typów zawartości - np. taki sam tytuł ma
obraz, artykuł, itd.
== Dalsza dyskusja ==
Na pewno nie wymieniłem wszystkich zagadnień związanych z krótkimi
URL, dlatego zachęcam do dalszej dyskusji.
1) Czy da się po stronie serwera podmienić adresy URL tak, aby były
wczytywane względem ścieżki bazowej?
Przykład: przeglądarka wysyła żądanie do: domena.com/modul/start, a
serwer jest w stanie załadować index.php znajdujący się w głównym
katalogu, a nie do strony 404 (?)
2) Co sądzicie o wykorzystaniu systemu plików?
3) Ścieżki bezwzględne, <base>, czy inne rozwiązanie?
4) Co sądzicie o globalnym indeksie URL? Czy to dobry pomysł?
5) Skomentujcie poszczególne aspekty / problemy opisane w powyższych
akapitach.
> Najpro�ciej tworzy� takie URL-e dla tre�ci:
> /artykul/50, /plik/99, /50 (kategoria)
> albo takie:
> /artykul/skrocony-tytul, /tytul-kategorii (kategoria)
albo /artykul/50/skrocony-tytul
50 dla systemu a skrocony-tytul (generowany automatycznie na podstawie
tytu�u strony) dla googli i oka - generalnie nie trzeba nawet duplikat�w
sprawdzaďż˝.
> == Dobrze, ale je�li brakuje mod_rewrite? ==
To zmien hosting, jesli nie ma mozliwosci zeby przestal
brakowac. mod_rewrite to podstawa i nie ma za bardzo powodu
zeby go nie bylo.
> A mo�e istnieje spos�b na implementacj� kr�tkich URL na serwerach bez
> mod_rewrite? Wpad�em na pomys�, aby wykorzysta� system plik�w.
[... ciach, duzo zbednych dywagacji ktore rozwiazuje mod_rewrite...]
Ale po co to wszystko? Za duzo masz wolnego czasu? Popros o dodanie
mod_rewrite na serwerze albo zmien hosting.
> == Implementacja kr�tkich URL w PHP ==
> Zamiast definiowaďż˝ wiele reguďż˝ w .htaccess i przerabiaďż˝ je na formďż˝ ?
> co=modul&act=send, mo�na przekierowa� wszystkie ��dania (kt�re nie
> odnosz� si� do istniej�cych plik�w) do strony: index.php?url=modul/
> send. Teraz �atwo poci�� URL:
wlasnie wymysliles "router pattern" :)
> Mo�na jeszcze bardziej skr�ci� URL-e, stosuj�c globalny indeks
> skr�conych tytu��w. Nie wiem, czy wszyscy b�d� w stanie zrozumie�,
> czym jest skr�cony URL, je�li zobacz� takie pole w formularzu - nawet
> mimo wyja�nie�.
W wiekszosci niestety nie zrozumie. Generuj automatycznie (np. na
podstawie tytulow a userowi daj mozliwosc edycji).
> A. Ten sam tytu� w r�nych wersjach j�zykowych strony - mo�e to by�
> tytu� skryptu lub programu. Zdaje si�, �e �atwo go obej�� - skrypt
> wczyta artyku� / plik / ... dla u�ywanego j�zyka (je�li istnieje).
Inne wersje jezykowe to tez inne tresci wiec albo masz jeden obiekt
ktory oznacza np. artykul i do niego dopiero linkujesz poszczegolne
wersje jezykowe (wtedy bez dla kazdej mozesz miec tez oddzielny url)
albo masz oddzielne obiekty (srednio sensowne) a wtedy tez nie ma
problemy.
> B. Te same tytu�y dla r�nych typ�w zawarto�ci - np. taki sam tytu� ma
> obraz, artykuďż˝, itd.
co za cos. albo jedna wspolna przestrzen albo jednak separujesz po
typach obiektow.
Pozdrawiam,
--
Szyfrowanie skryptow PHP v4 oraz v5. Blokady: czasowe, IP, MAC
Loadery dla systemow: Windows, Linux, MacOS, Free/BSD, Solaris
Zabezpiecz swoje skrypty PHP! Przetestuj http://phpencoder.pl
Czy znacznik <base> wpływa na wydajność przeglądarki? Może znacznie
spowolnić wyświetlanie stron?
IHMO bez znaczenia. Je�li nie zosta� podany adres bazowy przegl�darka i tak
go wyznacza z urla.