Aliasy i błędne adresy URL

  htaccess, Webhosting

W przypadku, gdy na swoim webhostingu korzystasz z aliasów lub subdomen, umieszczane na nich pliki są w rzeczywistości zlokalizowane w innym miejscu, niż wskazuje adres URL.

Przykład – strona, która nie jest aliasem:

  • adres URL: http://www.nie-jest-aliasem.cz/katalog/plik.php
  • lokalizacja na Twoim webhostingu: /katalog/plik.php

Przykład – strona, która jest aliasem:

  • adres URL: http://www.jakis-alias.cz/katalog/plik.php
  • lokalizacja na Twoim webhostingu: /domains/jakisalias.cz/katalog/plik.php

W pierwszym przykładzie lokalizacja odpowiada fizycznemu umiejscowieniu. W drugim przypadku adres URL nie wskazuje fizycznego umiejscowienia. Dla poprawnego działania konieczne jest zapewnienie tłumaczenia ścieżek w obu kierunkach.

Tłumaczenie adres URL -> lokalizacja fizyczna jest realizowane przez przygotowany przez nas plik .htaccess, w którym zdefiniowano odpowiednie reguły. W chwili, gdy otrzymamy zapytanie HTTP o adres URL http://www.jakis-alias.cz/katalog/plik.php, .htaccess przepisze go na  http://www.jakis-alias.cz/domains/jakis-alias.cz/katalog/plik.php, a następnie zrealizuje żądanie. W tym przypadku problem zwykle nie występuje.

Tłumaczeniem lokalizacja fizyczna -> adres URL musi zająć się sama aplikacja PHP, .htaccess tego nie wykona. Chodzi o to, jakie adresy URL aplikacja PHP wstawia do generowanego kodu HTML.

PHP i „aktualny” adres URL

Skrypt PHP musi być w stanie zorientować się, na którym z adresów się znajduje, aby mógł poprawnie kompilować inne linki URL do podstron itp.

Niewłaściwa aplikacja PHP  pobiera aktualny adres URL ze zmiennej $_SERVER[„PHP_SELF“] lub $_SERVER[„SCRIPT_NAME“]. Nie są to jednak zmienne zawierające adres URL, ale zmienne z informacją o fizycznym umiejscowieniu uruchomionego aktualnie skryptu PHP. Z tych danych nie zyskasz prawidłowej ścieżki, którą należy umieścić w adresie URL! Jeśli do Twojej strony kompilują się adresy URL podobne do poniższego, będzie to przyczyną błędu.

<a href="/domains/jakis-alias.cz/link/gdzie-indziejphp">link</a>

Pierwszym ze sposobów rozwiązania tego problemu jest zmodyfikowanie aplikacji PHP, tak aby w sposób poprawny, z wykorzystaniem odpowiedniej zmiennej wykrywała aktualny adres URL.

Sposób błędny:

$aktualny_katalog = dirname($_SERVER["PHP_SELF"]);

Sposób poprawny z użyciem zmiennej $_SERVER[„REQUEST_URI“]:

$aktualny_katalog = dirname($_SERVER["REQUEST_URI"]);

Teoretycznie wystarczy więc $_SERVER[„PHP_SELF“] zastąpić  $_SERVER[„REQUEST_URI“] . W praktyce może to być bardziej skomplikowane w zależności od sposobu programowania aplikacji PHP.

Kolejnym sposobem możliwym do zastosowania w ramach niektórych systemów, jest jawne ustawienie bazowego adresu URL, z którego korzysta system. W tym przypadku skrypty PHP nie podejmują żadnej próby detekcji aktualnego URL, ponieważ jest on określony w konfiguracji.

Komentarz:

W przypadku, gdy po instalacji Joomla na subdomenie będzie wyświetlać błąd No input file specified, wprowadź następujące zmiany:

W pliku .htaccess dodaj:

RewriteCond %{REQUEST_URI} ^/index\.php/
RewriteRule ^index.php/(.*) /$1 [R,L]