Jedną z metod na przyjazne URL-e jest wykorzystanie PATH_INFO.

W przeciwieństwie do mod_rewrite problem ze ścieżkami pojawia się także w PHP. smile.gif

Na początku zawsze tworzę pełny adres URL oraz ścieżkę:
Kod
define('PATH', str_replace('//','/',dirname($_SERVER['PHP_SELF']).'/'));
define('URL', 'http://'.$_SERVER['SERVER_NAME'].PATH);

Stała URL przechowuje pełną ścieżkę do serwisu.

Po co jeszcze tworzę stałą PATH i dołączam ją do URL? Niektóre serwisy znajdują się w podkatalogu, np. na localhost lub na darmowych hostingach bez subdomen.

Gdzie stosuję stałą URL? Na przykład przy przekierowaniach Location. Specyfikacja HTTP 1.1 każe podawać pełną ścieżkę, lecz przeglądarki przekierują także do adresu względnego. Wolę jednak trzymać się standardów - słusznie? winksmiley.jpg Poza tym wykorzystuję stałą w innych częściach serwisu, aby określić np. adres bazowy pliku RSS, wiadomości E-Mail...

Poniżej przedstawiam wartości pewnych elementów $_SERVER dla adresu: /index.php/art/1

Przykład 1 - mod_rewrite

PHP_SELF:
/sciezka/CMS/index.php

dirname(PHP_SELF) ? PATH:
/sciezka/CMS

Tutaj wszystko poprawnie.

Przykład 2 - PATH_INFO (bez mod_rewrite)

PHP_SELF:
/sciezka/CMS/index.php/art/1

dirname(PHP_SELF) ? PATH:
/sciezka/CMS/index.php/art

Jak sobie z tym próbuję poradzić?
Kod
$_SERVER['PHP_SELF'] = strstr($_SERVER['PHP_SELF'], 'index.php', 1);

Wszystko dobrze - /sciezka/CMS/ - ale:

dirname(PHP_SELF) wynosi: /sciezka zamiast /sciezka/CMS

Dlaczego funkcja ucina wartość "/CMS/"?

Dobrze, przecież mogę równie dobrze wyciąć ze ścieżki fragment:
Kod
'index.php/' . $_SERVER['PATH_INFO']

Jednak nie chcę nic przekombinować.

1) Czy modyfikować PHP_SELF tak, aby zawierał tylko /sciezka/CMS/? Czy to się nie opłaca?
2) Są lepsze sposoby na uzyskanie prawidłowej ścieżki? Bez zbędnych operacji, aby nie spowalniać skryptu.
3) Czy $_SERVER['SCRIPT_NAME'] działa także na innych serwerach niż Apache?