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

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);
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?

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?