Score:1

%{REQUEST_FILENAME}.ext หมายถึงอะไร ทำไมต้องลงท้ายด้วย .ext พิเศษ?

ธง dj

เดอะ %{REQUEST_FILENAME} มีสตริงดังนี้:

/web/webroot/index.php

ฉันเห็นผู้คนจำนวนมากแนะนำให้ทดสอบว่ามีไฟล์อยู่หรือไม่และมีนามสกุลเป็น .php ดังนี้:

RewriteCond %{REQUEST_FILENAME}.php -f

ไม่ใช่เหรอ .php หลังจาก %{REQUEST_FILENAME} ซ้ำซ้อน? ตัวแปรควรมีอยู่แล้ว .php, ขวา?

เหมือนจะเพิ่ม .php หลังจาก %{REQUEST_FILENAME} จะทำให้การตรวจสอบ TestString เพิ่ม .php พิเศษเช่นนี้:

/web/webroot/index.php.php

ฉันขาดอะไรง่ายๆ ฉันแน่ใจ แต่ฉันไม่รู้ว่ามันคืออะไร

บริบทคือ:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]
Score:1
ธง kz

ไม่ใช่เหรอ .php หลังจาก %{REQUEST_FILENAME} ซ้ำซ้อน? ตัวแปรควรมีอยู่แล้ว .php, ขวา?

ใช่และไม่ใช่ ขึ้นอยู่กับสิ่งที่คุณพยายามทำ

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

กฎนี้อนุญาตให้คุณขอ URL ที่ไม่มีส่วนขยาย เช่น. /ดัชนี หรือ /ฟู และนี่จะเขียนคำขอเป็นการภายในใหม่ /index.php และ /foo.php ตามลำดับ

ในกรณีนี้ REQUEST_FILENAME เป็นสตริงของแบบฟอร์ม /เว็บ/เว็บรูท/ดัชนี. ดังนั้นจึงกำลังทดสอบว่า /web/webroot/index.php มีอยู่ก่อนที่จะเขียนซ้ำให้เหมือนเดิม ถ้าจะขอ /index.php จากนั้น เงื่อนไข ล้มเหลวและไม่มีการเขียนใหม่เกิดขึ้น (ซึ่งถูกต้อง)

อย่างไรก็ตาม กฎนี้ไม่ได้ถูกต้องอย่างเคร่งครัด และอาจทำให้เกิดการวนรอบการเขียนใหม่ได้ภายใต้เงื่อนไขบางประการ ดูคำถามที่เกี่ยวข้องต่อไปนี้:

Jeff avatar
dj flag
ฉันเห็นว่าคุณรู้เรื่องของคุณ ฉันจะจ้องที่สิ่งนี้อีกสองสามชั่วโมงจนกว่าฉันจะเข้าใจ ฉันคิดว่าคุณกำลังบอกว่าตัวแปรถูกแก้ไขโดยต่อท้าย `.ext` แต่ฉันไม่พบพฤติกรรมนี้ที่บันทึกไว้ทุกที่ยกเว้นในฟอรัม SE แก้ไข: ใช่ โอเค ฉันเข้าใจแล้ว ขอบคุณ!
kz flag
@Jeff ตัวแปรเอง (เช่น `REQUEST_FILENAME`) ไม่ได้รับการแก้ไข มีเพียง _TestString_ (อาร์กิวเมนต์แรกของคำสั่ง `RewriteCond`) - ตามที่คุณระบุในคำถาม โดยพื้นฐานแล้วเป็นการทดสอบว่า URL ที่ร้องขอ + `.php` มีอยู่ในไฟล์จริงหรือไม่แม้ว่า `REQUEST_FILENAME` จะไม่ใช่ตัวแปรที่ถูกต้องอย่างเคร่งครัดที่จะใช้ที่นี่ (แม้ว่าจะใช้ได้ในกรณี _most_) ดังที่กล่าวไว้ในคำถามที่เชื่อมโยง (`REQUEST_FILENAME` คือ "ไฟล์" ที่ URL ที่ขอแมปไป)
Jeff avatar
dj flag
แน่นอนว่าฉันต้องการใช้ตัวแปรที่ถูกต้องอย่างเคร่งครัดในโค้ดของฉัน นี่คือตัวแปร: `%{DOCUMENT_ROOT}%{REQUEST_URI}.php -f` หรือไม่
kz flag
@Jeff ใช่ และเปลี่ยนสตริง `RewriteRule` _substitution_ ตามลำดับ เช่น. `RewriteRule ^ %{REQUEST_URI}.php [L]`
Jeff avatar
dj flag
ยอดเยี่ยม ขอบคุณมาก!
kz flag
@Jeff regex `!\.\w{2,4}$` ไม่รวมคำขอทั้งหมดที่มีนามสกุลไฟล์ _looks like_ อยู่แล้ว เป็นเพียงการเพิ่มประสิทธิภาพเพื่อป้องกันไม่ให้ทรัพยากรคงที่ทั้งหมด (รูปภาพ, CSS, JS, ฯลฯ ) ถูกทดสอบโดยไม่จำเป็นเพื่อดูว่า `image.jpg.php` มีอยู่จริงหรือไม่ (การตรวจสอบระบบไฟล์ค่อนข้างแพง) ไฟล์ไม่มี _normally_ มีสองนามสกุลไฟล์ เช่น `exists.qqq.php` ดังนั้นปกติแล้วจะไม่เป็นปัญหา แต่เป็นเพียงการเพิ่มประสิทธิภาพดังนั้นจึงปลอดภัยที่จะลบ คุณสามารถบรรลุการเพิ่มประสิทธิภาพที่คล้ายคลึงกันได้โดยการยกเว้นไดเร็กทอรีย่อยที่จัดเก็บเนื้อหาคงที่ทั้งหมดของคุณ
Jeff avatar
dj flag
สิ่งที่ดี. บรรทัด `RewriteCond` ก่อนการยกเว้น regex ไม่ได้แยกการทดสอบพิเศษเหล่านั้นทั้งหมดไปยังทรัพยากรแบบคงที่อื่น ๆ (นอกเหนือจากไฟล์ .html) หรือไม่
kz flag
@Jeff คำสั่ง `RewriteRule` ได้รับการประมวลผลก่อน เฉพาะเมื่อการจับคู่ 'RewriteRule' _pattern_ มีการประมวลผล _conditions_ ก่อนหน้าเท่านั้น หาก 'RewriteRule' _pattern_ ไม่สำเร็จ กฎทั้งหมดจะถูกข้ามและดำเนินการต่อ...
Jeff avatar
dj flag
ว้าวฉันไม่รู้ว่า ขอบคุณอีกครั้ง!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา