Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Automatyczne wykrywanie adresu URL
Forum PHP.pl > Forum > PHP
WebCM
Aplikacja ma 2 stałe. URL jest umieszczany w <base>.

URL - pełna ścieżka wraz z http://
PATH - katalog

Dawniej były wykrywane tylko raz przy instalacji. Są sytuacje, kiedy ścieżki ulegają zmianie:

1. Zakup domeny
2. Zmiana serwera
3. Kilka adresów lub domen, z www lub bez

W przypadku 1 i 2 admin musi zmienić ścieżki ręcznie w pliku konfiguracyjnym lub w panelu admina, bo system nie będzie działać. W przypadku 3 wystąpią problemy z sesjami, ciasteczkami i zabezpieczeniami.

Rozwiązaniem jest automatyczne wykrywanie ścieżki.

  1. define('PATH', str_replace('//','/',dirname($_SERVER['PHP_SELF']).'/'));
  2. define('URL','http://'.$_SERVER['SERVER_NAME'].PATH);

Jest 1 problem. Popatrzmy na drzewko plików i katalogów:
Kod
katalog
|--> admin
|-------> index.php - plik startowy panelu admina
|--> index.php - plik startowy części frontowej
|--> kernel.php - jądro systemu (tu następuje wykrycie ścieżki)
|--> request.php - plik startowy dla żądań AJAX
|--> login.php - plik startowy - logowanie
|--> fileman.php - plik startowy - menedżer plików

Jak widać, panel admina znajduje się w innym katalogu. Początek admin/index.php:

  1. chdir('..');
  2. require './kernel.php';

Panel admina nie jest osobną aplikacją, dlatego ścieżka powinna być taka sama jak w przypadku pozostałych podstron. Niestety, jest ona błędna.

Powinniśmy otrzymać: /katalog/
Otrzymujemy: /katalog/admin/

Rozwiązanie 1
  1. define('PATH', str_replace(array('//','/admin'), array('/',''), dirname($_SERVER['PHP_SELF']).'/'));
  2. define('URL','http://'.$_SERVER['SERVER_NAME'].PATH);

Może być więcej modułów w osobnych katalogach. Nie tylko 'admin'.

Rozwiązanie 2
Kopiować część kodu odpowiedzialną za wykrywanie URL? Jak widać, plików startowych jest dużo, a pełny kod jest następujący:
  1. #Path based on PATH_INFO or GET param
  2. if(isset($_SERVER['PATH_INFO'][1]))
  3. {
  4. $URL = explode('/', substr($_SERVER['PATH_INFO'],1));
  5. define('PATH', substr(dirname($_SERVER['PHP_SELF']),0,-9));
  6. }
  7. else
  8. {
  9. $URL = isset($_GET['go']) ? explode('/', $_GET['go']) : array();
  10. define('PATH', str_replace('//','/',dirname($_SERVER['PHP_SELF']).'/'));
  11. }
  12.  
  13. #Detect full URL
  14. define('URL','http://'.$_SERVER['SERVER_NAME'].PATH);

Inne rozwiązanie?
Jak poprawnie wykryć ścieżkę?
dżozef
  1. require './kernel.php';

zawsze wskazuje na bieżący katalog, użyj:
  1. require '../kernel.php';
WebCM
Chodzi o ścieżkę, którą przekazujemy do <base href="{URL}">, aby działały przyjazne URL.

Zapisywać domenę i ścieżkę przy instalacji? Czemu nie. Odciążymy serwer, bo nie będzie ich wykrywał przy każdym żądaniu. W razie potrzeby admin zmieni dane w ustawieniach. Czy to dobry pomysł? Są sytuacje awaryjne:

1. Kupujemy lub zmieniamy domenę
2. Przenosimy skrypt do innego folderu
3. Mamy skrypt na localhost, a podajemy osobom postronnym nasz IP
4. Odpalamy przeglądarkę na maszynie wirtualnej i podajemy IP
5. Możliwe inne komplikacje tutaj niewymienione

Z tego wynika, że lepiej wykrywać ścieżkę automatycznie. Ktoś ma lepszy pomysł, aby rozwiązać problem przedstawiony w pierwszym poście? Jednak istnieją zagrożenia związane z automatycznym wykrywaniem:

http://www.skeletonscribe.net/2013/05/prac...er-attacks.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.