Buduję aplikację PHP w CodeIgniter. CodeIgniter wysyła wszystkie żądania do głównego kontrolera: index.php
. Jednak nie lubię widzieć index.php
w URI. Na przykład http://www.example.com/faq/whatever
przekieruje do http://www.example.com/index.php/faq/whatever
. Potrzebuję wiarygodnego sposobu, aby skrypt wiedział, jaki jest adres, aby wiedział, co zrobić z nawigacją. Użyłem mod_rewrite
, zgodnie z dokumentacją CodeIgniter.
Zasada jest następująca:
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
Normalnie po prostu sprawdziłbym php_self
, ale w tym przypadku tak jest zawsze index.php
. Mogę dostać od REQUEST_URI
, PATH_INFO
itp, ale staram się zdecydować, który będzie najbardziej wiarygodne. Czy ktoś wie (lub wie gdzie znaleźć) prawdziwa różnica pomiędzy PHP_SELF
, PATH_INFO
, SCRIPT_NAME
, i REQUEST_URI
? Dzięki za pomoc!
Uwaga : musiałem dodać spacje, ponieważ SO widzi podkreślenie i z jakiegoś powodu czyni go kursywą.
Zaktualizowano : Naprawiono spacje.
źródło
Kilka praktycznych przykładów różnic między tymi zmiennymi:
Przykład 1. PHP_SELF różni się od SCRIPT_NAME tylko wtedy, gdy żądany adres URL ma postać:
http://example.com/test.php/foo/bar
(wydaje się, że jest to jedyny przypadek, gdy PATH_INFO zawiera sensowne informacje [PATH_INFO] => / foo / bar) Uwaga: kiedyś było inaczej w niektórych starszych wersjach PHP (<= 5.0?).
Przykład 2. REQUEST_URI różni się od SCRIPT_NAME, gdy wprowadzono niepusty ciąg zapytania:
http://example.com/test.php?foo=bar
Przykład 3. REQUEST_URI różni się od SCRIPT_NAME, gdy działa przekierowanie po stronie serwera (na przykład mod_rewrite w apache):
http://example.com/test.php
Przykład 4. REQUEST_URI różni się od SCRIPT_NAME podczas obsługi błędów HTTP w skryptach.
Korzystanie z dyrektywy Apache ErrorDocument 404 /404error.php
http://example.com/test.php
Na serwerze IIS przy użyciu niestandardowych stron błędów
http://example.com/test.php
źródło
/
na końcuSCRIPT_NAME
. Wydaje się to być spójne w PHP 5.2-5.4, biorąc pod uwagę edycję odpowiedzi, aby to odzwierciedlić.PATH_INFO
jest dostępne tylko podczas korzystania z htaccess w następujący sposób:Przykład 1
Pozostaje takie samo
Korzeń
http://domain.com/
Ścieżka
http://domain.com/test
Ciąg zapytania
http://domain.com/test?123
Przykład 2
Pozostaje takie samo
Korzeń
http://domain.com/
Ścieżka
http://domain.com/test
Ciąg zapytania
http://domain.com/test?123
Przykład 3
lub
Pozostaje takie samo
Korzeń
http://domain.com/
Ścieżka
http://domain.com/test
Język
http://domain.com/en
Ścieżka językowa
http://domain.com/en/test
Ciąg zapytania językowego
http://domain.com/en/test?123
źródło
Ścieżki PHP
$_SERVER['REQUEST_URI']
= Ścieżka sieciowa, żądany URI$_SERVER['PHP_SELF']
= ścieżka sieciowa, żądany plik + ścieżka info$_SERVER['SCRIPT_NAME']
= ścieżka sieciowa, żądany plik$_SERVER['SCRIPT_FILENAME']
= ścieżka do pliku, żądany plik__FILE__
= ścieżka do pliku, bieżący plikGdzie
/var/www/index.php
po rozwiązaniu aliasu/index.php
zhttp://foo.com/index.php
, i może nawet nie pasować do żadnego pliku/index.php?foo=bar
przed przepisaniem adresu URLKolejność operacji
REQUEST_URI
PHP_SELF
PHP_SELF
naSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
odnosi się do ścieżki do bieżącego plikuźródło
$_SERVER['SCRIPT_NAME']
i$_SERVER['PHP_SELF']
ponieważ mod_rewrite tworzysz całą ścieżkę, czyli$_SERVER['PHP_SELF']
. Następuje separacja. Należy zauważyć, że aliasy uwzględniają również całą ścieżkę do zdefiniowania nazwy pliku skryptu, ale separacja, która zdefiniowana nazwa_skryptu i informacje_ścieżki już wystąpiła, nie będzie miała na nie wpływu.Możesz zajrzeć do klasy URI i skorzystać z $ this-> uri-> uri_string ()
Zwraca ciąg z pełnym identyfikatorem URI.
Na przykład, jeśli to jest Twój pełny adres URL:
Funkcja zwróci to:
Możesz też wykorzystać segmenty do drążenia określonych obszarów bez konieczności opracowywania analizowania / wartości wyrażenia regularnego
źródło
Osobiście używam,
$REQUEST_URI
ponieważ odwołuje się do wprowadzonego URI, a nie do lokalizacji na dysku serwera.źródło
Do odpowiedzi Odyna można dodać bardzo niewiele. Po prostu poczułem, że mogę podać kompletny przykład z żądania HTTP do rzeczywistego pliku w systemie plików, aby zilustrować skutki przepisywania adresów URL i aliasów. W systemie plików skrypt
/var/www/test/php/script.php
togdzie
/var/www/test/php/script_included.php
jesti
/var/www/test/.htaccess
jesta plik konfiguracyjny Apache zawiera alias
a żądanie http to
Wynik będzie
Zawsze obowiązuje
Jeśli nie ma mod_rewrite, mod_dir, przepisywania ErrorDocument lub jakiejkolwiek formy przepisywania adresu URL, mamy również
Aliasy wpływają na systemowe ścieżki plików,
SCRIPT_FILENAME
a__FILE__
nie na ścieżki URL, które zostały wcześniej zdefiniowane - zobacz wyjątki poniżej. Aliasy mogą wykorzystywać całą ścieżkę adresu URL, w tymPATH_INFO
. W ogóle nie mogło być żadnego połączenia międzySCRIPT_NAME
aSCRIPT_FILENAME
.Nie jest całkowicie dokładne, że aliasy nie są rozwiązywane w momencie
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
definiowania ścieżki URL , ponieważ uważa się, że aliasy przeszukują system plików, a wiemy z przykładu 4 w odpowiedzi Odyna, że system plików jest przeszukiwany w celu ustalenia, czy plik istnieje, ale ma to znaczenie tylko wtedy, gdy plik nie zostanie znaleziony. Podobnie, mod_dir wywołuje mod_alias w celu przeszukania systemu plików, ale ma to znaczenie tylko wtedy, gdy masz alias taki jak,Alias \index.php \var\www\index.php
a uri żądania jest katalogiem.źródło
Jeśli kiedykolwiek zapomnisz, które zmienne co robią, możesz napisać mały skrypt, który używa phpinfo () i wywołać go z adresu URL z ciągiem zapytania. Ponieważ instalacje oprogramowania serwera przedstawiają zmienne zwracane przez PHP, zawsze dobrym pomysłem jest sprawdzenie danych wyjściowych maszyny na wypadek, gdyby ponowne zapisywanie w pliku konfiguracyjnym serwera powodowało inne wyniki niż oczekiwano. Zapisz to jako coś takiego
_inf0.php
:Wtedy byś zadzwonił
/_inf0.php?q=500
źródło
Zrób kopię zapasową na sekundę, na początku wybrałeś niewłaściwe podejście. Dlaczego po prostu tego nie zrobić
zamiast? Następnie złap go
$_GET['url'];
źródło
QSA
flaga), parametry ciągu zapytania mogą zostać potencjalnie nadpisane (na przykład, jeśli potrzebujeszurl
parametru w początkowym żądaniu) lub, co gorsza, być podatnym na ataki XSS.