PHP_SELF กับ PATH_INFO กับ SCRIPT_NAME เทียบกับ REQUEST_URI


106

ฉันกำลังสร้างแอปพลิเคชัน PHP ใน CodeIgniter CodeIgniter ส่งคำขอทั้งหมดไปยังคอนโทรลเลอร์หลัก: index.php. อย่างไรก็ตามฉันไม่ชอบเห็นindex.phpใน URI ตัวอย่างเช่นhttp://www.example.com/faq/whateverจะกำหนดเส้นทางไปยังhttp://www.example.com/index.php/faq/whateverความประสงค์เส้นทางที่จะไปฉันต้องการวิธีที่เชื่อถือได้เพื่อให้สคริปต์รู้ว่าที่อยู่คืออะไรจึงจะรู้ว่าจะต้องทำอย่างไรกับการนำทาง ฉันเคยใช้mod_rewriteตามเอกสารของ CodeIgniter

กฎมีดังนี้:

RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L] 

ปกติผมก็จะตรวจสอบแต่ในกรณีนี้มันเสมอphp_self index.phpฉันจะได้รับจากREQUEST_URI, PATH_INFOฯลฯ แต่ฉันพยายามที่จะตัดสินใจว่าจะเป็นที่น่าเชื่อถือที่สุด ไม่มีใครรู้ (หรือทราบว่าจะหา) ความแตกต่างระหว่างจริงPHP_SELF, PATH_INFO, SCRIPT_NAMEและREQUEST_URI? ขอบคุณสำหรับความช่วยเหลือของคุณ!

บันทึก : ฉันต้องเพิ่มช่องว่างเนื่องจาก SO เห็นขีดล่างและทำให้เป็นตัวเอียงด้วยเหตุผลบางประการ

อัปเดต : แก้ไขช่องว่าง

คำตอบ:


50

เอกสาร PHPสามารถบอกคุณได้แตกต่าง:

'PHP_SELF'

ชื่อไฟล์ของสคริปต์ที่กำลังดำเนินการอยู่โดยสัมพันธ์กับรูทเอกสาร ตัวอย่างเช่น$ _SERVER ['PHP_SELF']ในสคริปต์ที่อยู่http://example.com/test.php/foo.barจะเป็น /test.php/foo.bar __FILE__คงมีเส้นทางที่เต็มรูปแบบและชื่อไฟล์ของปัจจุบัน (เช่นรวม) ไฟล์ หาก PHP ทำงานเป็นตัวประมวลผลบรรทัดคำสั่งตัวแปรนี้มีชื่อสคริปต์ตั้งแต่ PHP 4.3.0 ก่อนหน้านี้ไม่สามารถใช้ได้

"SCRIPT_NAME"

มีพา ธ ของสคริปต์ปัจจุบัน สิ่งนี้มีประโยชน์สำหรับหน้าที่ต้องการชี้มาที่ตัวเอง __FILE__คงมีเส้นทางที่เต็มรูปแบบและชื่อไฟล์ของปัจจุบัน (เช่นรวม) ไฟล์

"REQUEST_URI"

URI ที่ได้รับเพื่อเข้าถึงหน้านี้ ตัวอย่างเช่น'/index.html'

PATH_INFO ดูเหมือนจะไม่ได้รับการบันทึกไว้ ...


3
สิ่งนี้น่าจะไม่เกี่ยวกับเอกสาร PHP แต่เป็น CGI :) และมีเอกสาร PATH_INFO: tools.ietf.org/html/rfc3875#section-4แต่มีปัญหาที่ทราบบางประการที่ Apache และ nginx ไม่ได้ให้ตัวแปรนี้เสมอไป
SimonSimCity

1
คำตอบของ Odin ด้านล่างนี้จะเพิ่มคำอธิบายที่เป็นประโยชน์พร้อมตัวอย่างประกอบ ฉันพบว่ามันยากที่จะเข้าใจว่าตัวแปรเหล่านี้แสดงถึงอะไรในบริบททั่วไปด้วย path_info สตริงการค้นหาการเปลี่ยนเส้นทางบางนามแฝงบางนามบนระบบปฏิบัติการที่แตกต่างกันจาก CLI เทียบกับเซิร์ฟเวอร์ ฯลฯ

4
-1 เพื่อเป็นคำอธิบายว่าทำไมฉันจึงโหวตให้คะแนน: เหตุผลทั้งหมดที่ฉันมาที่โพสต์นี้เป็นเพราะเอกสารประกอบไม่ชัดเจน คำตอบของ Odin ด้านล่างให้คำอธิบายที่ชัดเจนเกี่ยวกับความแตกต่างระหว่างตัวแปรเหล่านี้ ฉันรู้สึกว่ามันเป็นคำตอบที่ไม่เพียงพอที่จะคัดลอกและวางที่พบได้ง่าย แต่ก็มีเอกสารประกอบไม่เพียงพอ ฉันเชื่อว่าคนส่วนใหญ่จะต้องเคยไปที่เอกสารเพื่อที่จะรู้เกี่ยวกับรายการองค์ประกอบในตัวแปร $ _SERVER ที่กล่าวถึงข้างต้น
dallin

231

ตัวอย่างที่ใช้ได้จริงของความแตกต่างระหว่างตัวแปรเหล่านี้:
ตัวอย่างที่ 1 PHP_SELF แตกต่างจาก SCRIPT_NAME เฉพาะเมื่อ URL ที่ร้องขออยู่ในรูปแบบ:
http://example.com/test.php/foo/bar

[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php

(ดูเหมือนจะเป็นกรณีเดียวเมื่อ PATH_INFO มีข้อมูลที่สมเหตุสมผล [PATH_INFO] => / foo / bar) หมายเหตุ: สิ่งนี้เคยแตกต่างกันใน PHP เวอร์ชันเก่าบางรุ่น (<= 5.0?)

ตัวอย่างที่ 2. REQUEST_URI แตกต่างจาก SCRIPT_NAME เมื่อป้อนสตริงการสืบค้นที่ไม่ว่างเปล่า:
http://example.com/test.php?foo=bar

[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar

ตัวอย่างที่ 3 REQUEST_URI แตกต่างจาก SCRIPT_NAME เมื่อการเปลี่ยนเส้นทางฝั่งเซิร์ฟเวอร์มีผล (เช่น mod_rewrite บน apache):

http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php

ตัวอย่างที่ 4. REQUEST_URI แตกต่างจาก SCRIPT_NAME เมื่อจัดการข้อผิดพลาด HTTP ด้วยสคริปต์
การใช้ apache directive ErrorDocument 404 /404error.php
http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php

บนเซิร์ฟเวอร์ IIS โดยใช้เพจข้อผิดพลาดที่กำหนดเอง
http://example.com/test.php

[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php

22
+1, "ตัวอย่างไม่ใช่วิธีเรียนรู้ แต่เป็นวิธีเดียวที่จะเรียนรู้" - ฉันต้องตรวจสอบสิ่งนี้อีกครั้งเสมอการวิจัยที่ดีมากเกี่ยวกับข้อผิดพลาด 404 =)
Alix Axel

17
+1: ครั้งแรกในชีวิตฉันเข้าใจความแตกต่าง พวกเขาควรอัปเดตเอกสาร PHP ด้วยคำตอบของคุณ
Marco Demaio

ตัวอย่างที่ 1: [SCRIPT_NAME] => /test.php/ ไม่ควรมี "/" ต่อท้าย: Example1: [SCRIPT_NAME] => /test.php อย่างไรก็ตามนั่นคือสิ่งที่ฉันเห็นใน PHP 5.3.6 ตัวอย่างที่ดี
Dawid Ohia

คุณถูกต้อง JohnM2 ตอนนี้ฉันได้ตรวจสอบ PHP 5.4 แล้วและผลลัพธ์สำหรับ URL /pinfo.php/first/second?third=fourth เป็นดังนี้ QUERY_STRING => third = four REQUEST_URI => /pinfo.php/first/second ? third = ที่สี่ SCRIPT_NAME => /pinfo.php PATH_INFO => / ครั้งแรก / วินาที
Odin

ฉันได้ทดสอบสิ่งนี้ใน 5.2.17 ด้วยและไม่มี/ส่วนท้ายของSCRIPT_NAME. สิ่งนี้ดูเหมือนจะสอดคล้องกันใน PHP 5.2-5.4 จากนั้นพิจารณาแก้ไขคำตอบเพื่อสะท้อนสิ่งนั้น
FabrícioMatté

24

PATH_INFO ใช้ได้เฉพาะเมื่อใช้ htaccess ดังนี้:

ตัวอย่าง 1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

ยังคงเหมือนเดิม

[SCRIPT_NAME] => /index.php

ราก

http://domain.com/

[PHP_SELF]     => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI]  => /
[QUERY_STRING] => 

เส้นทาง

http://domain.com/test

[PHP_SELF]     => /index.php/test
[PATH_INFO]    => /test
[REQUEST_URI]  => /test
[QUERY_STRING] => 

สตริงการสืบค้น

http://domain.com/test?123

[PHP_SELF]     => /index.php/test
[PATH_INFO]    => /test
[REQUEST_URI]  => /test?123
[QUERY_STRING] => 123

ตัวอย่าง 2

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

ยังคงเหมือนเดิม

[SCRIPT_NAME]  => /index.php
[PHP_SELF]     => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)

ราก

http://domain.com/

[REQUEST_URI]  => /
[QUERY_STRING] => 

เส้นทาง

http://domain.com/test

[REQUEST_URI]  => /test
[QUERY_STRING] => url=test

สตริงการสืบค้น

http://domain.com/test?123

[REQUEST_URI]  => /test?123
[QUERY_STRING] => url=test&123

ตัวอย่างที่ 3

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(([a-z]{2})|(([a-z]{2})/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]

หรือ

RewriteRule ^([a-z]{2})(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

ยังคงเหมือนเดิม

[SCRIPT_NAME] => /index.php

ราก

http://domain.com/

[PHP_SELF]          => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI]       => /
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] IS NOT AVAILABLE

เส้นทาง

http://domain.com/test

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /test
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] => 

ภาษา

http://domain.com/en

[PHP_SELF]          => /index.php/
[PATH_INFO]         => /
[REQUEST_URI]       => /en
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] => en

เส้นทางภาษา

http://domain.com/en/test

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test
[REDIRECT_LANGUAGE] => en

สตริงการสืบค้นภาษา

http://domain.com/en/test?123

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test?123
[QUERY_STRING]      => 123
[REDIRECT_LANGUAGE] => en

มันเยี่ยมมาก ขอบคุณสำหรับความช่วยเหลือของคุณ!
Gabriel Fair

1
คำตอบนี้เขียนในลักษณะที่ชี้ให้เห็นว่าการเขียน URL ใหม่เท่านั้นที่สามารถสร้าง path_info ได้ แต่แน่นอนว่าสามารถป้อนข้อมูลเส้นทางใน URL เดิมได้โดยตรง

12

เส้นทาง PHP

    $_SERVER['REQUEST_URI']    = เส้นทางเว็บ, URI ที่ร้องขอ
    $_SERVER['PHP_SELF']    = เส้นทางเว็บ, ไฟล์ที่ร้องขอ + ข้อมูลเส้นทาง
    $_SERVER['SCRIPT_NAME']    = เส้นทางเว็บ, ไฟล์ที่ร้องขอ
    $_SERVER['SCRIPT_FILENAME']   = เส้นทางไฟล์, ไฟล์ที่ร้องขอ
    __FILE__    = เส้นทางไฟล์, ไฟล์ปัจจุบัน

ที่ไหน

  • เส้นทางไฟล์เป็นเส้นทางไฟล์ระบบเช่น/var/www/index.phpหลังจากการแก้ปัญหานามแฝง
  • เส้นทางเว็บเป็นเส้นทางเอกสารของเซิร์ฟเวอร์เช่น/index.phpจาก http://foo.com/index.phpและอาจไม่ตรงกับไฟล์ใด ๆ
  • ไฟล์ปัจจุบันหมายถึงไฟล์สคริปต์ที่รวมไม่ใช่สคริปต์ใด ๆ ที่มีอยู่
  • ไฟล์ที่ร้องขอหมายถึงไฟล์สคริปต์รวมไม่ใช่ไฟล์ที่รวม
  • URIเป็นคำขอ HTTPเช่น/index.php?foo=barก่อนที่จะเขียนใหม่ URL ใด ๆ
  • ข้อมูลเส้นทางคือข้อมูล Apache เพิ่มเติมใด ๆ ที่อยู่หลังชื่อสคริปต์ แต่อยู่ก่อนสตริงการสืบค้น

ลำดับการทำงาน

  1. ไคลเอนต์ส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์ REQUEST_URI
  2. เซิร์ฟเวอร์ทำการเขียน URL ใหม่จากไฟล์. htaccess ฯลฯ เพื่อรับPHP_SELF
  3. เซิร์ฟเวอร์แยกออกPHP_SELFเป็นSCRIPT_FILENAME+PATH_INFO
  4. เซิร์ฟเวอร์ดำเนินการแก้ปัญหานามแฝงและแปลงเส้นทาง URLทั้งหมดเป็นเส้นทางไฟล์ระบบเพื่อรับSCRIPT_FILENAME
  5. ไฟล์สคริปต์ผลลัพธ์อาจรวมถึงไฟล์อื่น ๆ ซึ่ง__FILE__อ้างถึงเส้นทางไปยังไฟล์ปัจจุบัน

ดีจัง. นี่คือความคิดเห็นของฉัน อันดับแรกทั้ง $ _SERVER ['SCRIPT_NAME'] และ $ _SERVER ['SCRIPT_FILENAME'] เป็นชื่อสคริปต์ยกเว้นว่าภายหลังจะเรียกใช้ชื่อแทน ประการที่สอง $ _SERVER ['PHP_SELF'] ไม่ใช่สคริปต์ แต่เป็นสคริปต์ + ข้อมูลเส้นทาง อีกครั้ง $ _SERVER ['SCRIPT_NAME'] คือสคริปต์ (ก่อนนามแฝง) สุดท้ายนี้เป็นประโยชน์ที่จะทราบว่าในขั้นตอนใดหลังจากหรือก่อนเขียนกฎใหม่หลังจากหรือก่อนนามแฝงตัวแปรเหล่านี้จะถูกกำหนด ดูคำตอบของฉัน

@ Dominic108 ฉันแก้ไขคำตอบของฉันตามคำแนะนำของคุณจัดระเบียบสิ่งต่างๆเล็กน้อยและเพิ่มส่วน Order of Operation แจ้งให้เราทราบสิ่งที่คุณคิด. ขอบคุณ!
Beejor

ในการสั่งซื้อของคุณคุณต้องแลกเปลี่ยน$_SERVER['SCRIPT_NAME']และ   $_SERVER['PHP_SELF']เพราะ mod_rewrite $_SERVER['PHP_SELF']สร้างเส้นทางทั้งหมดซึ่งเป็น การแยกเกิดขึ้นต่อไป โปรดทราบว่านามแฝงยังพิจารณาเส้นทางทั้งหมดเพื่อกำหนดชื่อไฟล์สคริปต์ แต่การแยกที่กำหนด script_name และ path_info เกิดขึ้นแล้วดังนั้นจึงจะไม่ได้รับผลกระทบ

@ Dominic108 ฉันแก้ไขคำตอบของฉันอีกครั้ง ด้วยเหตุผลบางประการข้อเสนอการแก้ไขของคุณถูกปฏิเสธแม้ว่าเท่าที่ฉันทราบคุณถูกต้องที่สองรายการของฉันไม่เป็นระเบียบ ฉันไม่คุ้นเคยกับนามแฝงดังนั้นฉันจึงอาศัยความเชี่ยวชาญของคุณในส่วนนั้น ขอบคุณอีกครั้ง!
Beejor

5

คุณอาจต้องการดูคลาส URIและใช้ $ this-> uri-> uri_string ()

ส่งคืนสตริงที่มี URI ที่สมบูรณ์

ตัวอย่างเช่นหากนี่คือ URL แบบเต็มของคุณ:

http://example.com/index.php/news/local/345

ฟังก์ชันจะคืนค่านี้:

/news/local/345

หรือคุณสามารถใช้ประโยชน์จากกลุ่มเพื่อเจาะลึกพื้นที่เฉพาะโดยไม่ต้องใช้ค่าการแยกวิเคราะห์ / regex


ขอบคุณ - นี่เป็นความคิดที่ดี แต่ฉันกำลังใช้สิ่งเหล่านี้ในเบ็ดก่อนระบบซึ่งจะต้องทำงานก่อนที่คอนโทรลเลอร์จะเริ่มทำงาน
Eli

4

โดยส่วนตัวแล้วฉันใช้$REQUEST_URIตามที่อ้างถึง URI ที่ป้อนไม่ใช่ตำแหน่งบนดิสก์ของเซิร์ฟเวอร์


เป็น URI ที่สมบูรณ์เสมอหรือไม่?
Eli

โดยทั่วไปคุณสามารถพบปัญหาเกี่ยวกับ apache บน windows ได้ แต่สำหรับ URI เท่านั้นที่ไม่สามารถแก้ไขได้
Xenph Yan

4

คำตอบของ Odin มีน้อยมาก ฉันแค่รู้สึกว่าจะให้ตัวอย่างที่สมบูรณ์จากคำขอ HTTP ไปยังไฟล์จริงในระบบไฟล์เพื่อแสดงผลของการเขียน URL และนามแฝง บนระบบไฟล์สคริปต์/var/www/test/php/script.phpคือ

<?php
include ("script_included.php")
?>

ที่/var/www/test/php/script_included.phpเป็น

<?php
echo "REQUEST_URI: " .  $_SERVER['REQUEST_URI'] . "<br>"; 
echo "PHP_SELF: " .  $_SERVER['PHP_SELF'] . "<br>";
echo "QUERY_STRING: " .  $_SERVER['QUERY_STRING'] . "<br>";
echo "SCRIPT_NAME: " .  $_SERVER['SCRIPT_NAME'] . "<br>";
echo "PATH_INFO: " .  $_SERVER['PATH_INFO'] . "<br>";
echo "SCRIPT_FILENAME: " . $_SERVER['SCRIPT_FILENAME'] . "<br>";
echo "__FILE__ : " . __FILE__ . "<br>";  
?>

และ /var/www/test/.htaccess เป็น

RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1 

และไฟล์การกำหนดค่า Apache มีนามแฝง

Alias /test/after_rewrite/ /var/www/test/php/

และคำขอ http คือ

www.example.com/test/before_rewrite/script.php/path/info?q=helloword

ผลลัพธ์จะเป็น

REQUEST_URI: /test/before_rewrite/script.php/path/info?q=helloword
PHP_SELF: /test/after_rewrite/script.php/path/info
QUERY_STRING: q=helloword
SCRIPT_NAME: /test/after_rewrite/script.php
PATH_INFO: /path/info
SCRIPT_FILENAME: /var/www/test/php/script.php
__FILE__ : /var/www/test/php/script_included.php

ต่อไปนี้ถือเสมอ

PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string. 

หากไม่มี mod_rewrite, mod_dir, ErrorDocument rewrite หรือรูปแบบการเขียน URL ใหม่เรายังมี

REQUEST_URI = PHP_SELF + ? + QUERY_STRING 

นามแฝงมีผลต่อพา ธ ไฟล์ระบบSCRIPT_FILENAMEและ__FILE__ไม่ใช่เส้นทาง URL ซึ่งกำหนดไว้ก่อนดูข้อยกเว้นด้านล่าง นามแฝงอาจใช้เส้นทาง URL PATH_INFOทั้งหมดรวมทั้ง อาจจะมีการเชื่อมต่อที่ทุกคนระหว่างไม่มีและSCRIPT_NAMESCRIPT_FILENAME

ไม่แน่นอนโดยสิ้นเชิงที่นามแฝงจะไม่ได้รับการแก้ไขในเวลาที่[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO] กำหนดเส้นทาง URL เนื่องจากนามแฝงถูกพิจารณาเพื่อค้นหาระบบไฟล์และเรารู้จากตัวอย่างที่ 4 ในคำตอบของ Odin ว่าระบบไฟล์ถูกค้นหาเพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่ แต่จะเกี่ยวข้องเมื่อไม่พบไฟล์เท่านั้น ในทำนองเดียวกัน mod_dir เรียก mod_alias เพื่อค้นหาระบบไฟล์ แต่จะเกี่ยวข้องก็ต่อเมื่อคุณมีนามแฝงเช่นAlias \index.php \var\www\index.phpและคำขอ uri เป็นไดเร็กทอรี


สวัสดี Dominic108 ขอบคุณสำหรับการแก้ไข ฉันคิดว่าการรวมข้อมูลการเขียนซ้ำจะมีประโยชน์ สำหรับฉันแล้วมันบอกเป็นนัยว่า แต่สำหรับคนอื่น ๆ มันอาจจะไม่เข้าใจง่ายขนาดนั้น
Beejor

1

หากคุณเคยลืมว่าตัวแปรใดทำอะไรคุณสามารถเขียนสคริปต์เล็ก ๆ น้อย ๆ ที่ใช้phpinfo ()และเรียกใช้จาก URL ด้วยสตริงการสืบค้น เนื่องจากการติดตั้งซอฟต์แวร์เซิร์ฟเวอร์แสดงตัวแปรที่ PHP ส่งคืนจึงควรตรวจสอบผลลัพธ์ของเครื่องเสมอในกรณีที่การเขียนซ้ำที่ไฟล์กำหนดค่าเซิร์ฟเวอร์ทำให้เกิดผลลัพธ์ที่แตกต่างจากที่คาดไว้ บันทึกเป็นสิ่งที่ชอบ_inf0.php:

<?php
    $my_ip = '0.0.0.0';

   if($_SERVER['REMOTE_ADDR']==$my_ip){
     phpinfo();
   } else {
     //something
   }

แล้วคุณจะโทร /_inf0.php?q=500


-1

สำรองข้อมูลไว้สักครู่คุณได้ใช้แนวทางที่ไม่ถูกต้องในการเริ่มต้น ทำไมไม่ทำแบบนี้

RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php?url=$1 [L]

แทน? แล้วคว้าด้วย$_GET['url'];


ทำไมต้องคิดค้นล้อใหม่? ข้อมูลนี้เข้าถึงได้ง่ายกว่ามาก!
Kenneth

และมีความซับซ้อนเพิ่มเติมหากคาดว่าคำขอเดิมจะมีสตริงแบบสอบถาม ในสถานะปัจจุบันโค้ดด้านบนจะเขียนทับสตริงการสืบค้น หากคุณรวมสตริงการสืบค้น ( QSAแฟล็ก) urlพารามิเตอร์สตริงการสืบค้นอาจถูกเขียนทับ (ตัวอย่างเช่นหากคุณต้องการพารามิเตอร์ในคำขอเริ่มต้น) หรือแย่กว่านั้นคือเสี่ยงต่อการโจมตี XSS
MrWhite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.