Saya sedang membangun aplikasi PHP di CodeIgniter. CodeIgniter mengirimkan semua permintaan untuk pengendali utama: index.php
. Namun, saya tidak suka melihat index.php
di URI. Misalnya, http://www.example.com/faq/whatever
akan merutekan ke http://www.example.com/index.php/faq/whatever
. Saya membutuhkan cara yang andal agar skrip mengetahui alamatnya, sehingga ia akan tahu apa yang harus dilakukan dengan navigasi. Saya telah menggunakan mod_rewrite
, sesuai dokumentasi CodeIgniter.
Aturannya adalah sebagai berikut:
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
Biasanya, saya hanya akan memeriksa php_self
, tetapi dalam kasus ini selalu index.php
. Saya bisa mendapatkannya dari REQUEST_URI
,, PATH_INFO
dll., Tetapi saya mencoba memutuskan mana yang paling dapat diandalkan. Apakah ada yang tahu (atau tahu di mana untuk menemukan) perbedaan nyata antara PHP_SELF
, PATH_INFO
, SCRIPT_NAME
, dan REQUEST_URI
? Terima kasih atas bantuan Anda!
Catatan : Saya harus menambahkan spasi, karena SO melihat garis bawah, dan membuatnya miring karena beberapa alasan.
Diperbarui : Memperbaiki spasi.
sumber
Beberapa contoh praktis dari perbedaan antara variabel-variabel ini:
Contoh 1. PHP_SELF berbeda dari SCRIPT_NAME hanya jika URL yang diminta dalam bentuk:
http://example.com/test.php/foo/bar
(ini tampaknya menjadi satu-satunya kasus ketika PATH_INFO berisi informasi yang masuk akal [PATH_INFO] => / foo / bar) Catatan: ini dulunya berbeda di beberapa versi PHP yang lebih lama (<= 5.0?).
Contoh 2. REQUEST_URI berbeda dari SCRIPT_NAME ketika string kueri yang tidak kosong dimasukkan:
http://example.com/test.php?foo=bar
Contoh 3. REQUEST_URI berbeda dari SCRIPT_NAME saat pengalihan sisi server aktif (misalnya mod_rewrite di apache):
http://example.com/test.php
Contoh 4. REQUEST_URI berbeda dari SCRIPT_NAME saat menangani kesalahan HTTP dengan skrip.
Menggunakan direktif apache ErrorDocument 404 /404error.php
http://example.com/test.php
Di server IIS menggunakan halaman kesalahan khusus
http://example.com/test.php
sumber
/
di akhirSCRIPT_NAME
. Ini tampaknya konsisten di PHP 5.2-5.4, mempertimbangkan mengedit jawaban untuk mencerminkan itu.PATH_INFO
hanya tersedia jika menggunakan htaccess seperti ini:Contoh 1
Tetap sama
Akar
http://domain.com/
Jalan
http://domain.com/test
String Kueri
http://domain.com/test?123
Contoh 2
Tetap sama
Akar
http://domain.com/
Jalan
http://domain.com/test
String Kueri
http://domain.com/test?123
Contoh 3
atau
Tetap sama
Akar
http://domain.com/
Jalan
http://domain.com/test
Bahasa
http://domain.com/en
Jalur bahasa
http://domain.com/en/test
Bahasa Query string
http://domain.com/en/test?123
sumber
Jalur PHP
$_SERVER['REQUEST_URI']
= Jalur web, URI yang diminta$_SERVER['PHP_SELF']
= Jalur web, file yang diminta + jalur info$_SERVER['SCRIPT_NAME']
= Jalur web, file yang diminta$_SERVER['SCRIPT_FILENAME']
= Jalur file, file yang diminta__FILE__
= Jalur file, file saat iniDimana
/var/www/index.php
, setelah resolusi alias/index.php
darihttp://foo.com/index.php
, dan bahkan mungkin tidak cocok dengan file apa pun/index.php?foo=bar
, sebelum URL ditulis ulangUrutan Operasi
REQUEST_URI
PHP_SELF
PHP_SELF
menjadiSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
merujuk ke jalur ke file saat inisumber
$_SERVER['SCRIPT_NAME']
dan$_SERVER['PHP_SELF']
, karena mod_rewrite membuat seluruh jalur, yaitu$_SERVER['PHP_SELF']
. Pemisahan terjadi selanjutnya. Perhatikan bahwa alias juga mempertimbangkan seluruh jalur untuk menentukan nama file skrip, tetapi pemisahan yang mendefinisikan nama_krip dan path_info sudah terjadi, sehingga tidak akan terpengaruh.Anda mungkin ingin melihat Kelas URI dan menggunakan $ this-> uri-> uri_string ()
Mengembalikan string dengan URI lengkap.
Misalnya, jika ini adalah URL lengkap Anda:
Fungsi tersebut akan mengembalikan ini:
Atau Anda dapat menggunakan segmen untuk menelusuri area tertentu tanpa harus menghasilkan nilai parsing / regex
sumber
Secara pribadi saya menggunakan
$REQUEST_URI
referensi URI yang dimasukkan dan bukan lokasi di disk server.sumber
Sangat sedikit yang bisa ditambahkan pada jawaban Odin. Saya hanya merasa memberikan contoh lengkap dari permintaan HTTP ke file aktual pada sistem file untuk menggambarkan efek penulisan ulang dan alias URL. Di sistem file, skripnya
/var/www/test/php/script.php
adalahdi mana
/var/www/test/php/script_included.php
adalahdan
/var/www/test/.htaccess
adalahdan file konfigurasi Apache menyertakan alias
dan permintaan http adalah
Outputnya adalah
Yang berikut selalu berlaku
Jika tidak ada mod_rewrite, mod_dir, ErrorDocument rewrite atau bentuk penulisan ulang URL apa pun, kami juga memiliki
Alias tersebut mempengaruhi jalur file sistem
SCRIPT_FILENAME
dan__FILE__
, bukan jalur URL, yang ditentukan sebelumnya - lihat pengecualian di bawah. Alias mungkin menggunakan seluruh jalur URL, termasukPATH_INFO
. Tidak ada hubungan sama sekali antaraSCRIPT_NAME
danSCRIPT_FILENAME
.Tidak sepenuhnya persis bahwa alias tidak diselesaikan pada saat jalur URL
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
ditentukan, karena alias dianggap mencari sistem file dan kita tahu dari contoh 4 dalam jawaban Odin bahwa sistem file dicari untuk menentukan apakah file tersebut ada, tetapi ini hanya relevan jika file tidak ditemukan. Demikian pula, mod_dir memanggil mod_alias untuk mencari sistem file, tetapi ini hanya relevan jika Anda memiliki alias sepertiAlias \index.php \var\www\index.php
dan permintaan uri adalah direktori.sumber
Jika Anda lupa variabel mana melakukan apa, Anda dapat menulis skrip kecil yang menggunakan phpinfo () dan memanggilnya dari URL dengan string kueri. Karena penginstalan perangkat lunak server menampilkan variabel yang dikembalikan PHP, sebaiknya periksa keluaran mesin jika penulisan ulang pada file konfigurasi server menyebabkan hasil yang berbeda dari yang diharapkan. Simpan sebagai sesuatu seperti
_inf0.php
:Kemudian Anda akan menelepon
/_inf0.php?q=500
sumber
Cadangkan sebentar, Anda telah mengambil pendekatan yang salah untuk memulai. Mengapa tidak melakukan ini saja
sebagai gantinya? Lalu ambil dengan
$_GET['url'];
sumber
QSA
bendera) maka parameter string kueri berpotensi ditimpa (misalnya, jika Anda memerlukanurl
param pada permintaan awal) atau lebih buruk lagi, rentan terhadap serangan XSS.