Apache จะตรวจสอบ RewriteRule ในทุกคำขอหรือไม่หาก REQUEST_URI ไม่ได้ตั้งค่าไว้อย่างชัดเจนใน RewriteCond

ฉันค่อนข้างใหม่กับ Apache Rewrites ดังนั้นนี่อาจเป็นคำถามง่ายๆ (ซึ่งไม่ง่ายนักที่จะค้นหาคำตอบโดยตรง)

ดังนั้นฉันจึงเขียนใหม่ดังต่อไปนี้:

RewriteCond %{QUERY_STRING} ^parm=([a-z]+)$ [NC]
RewriteRule ^path/to/some_script.php /simple-url-$1.html? [R=301,L]

ซึ่งดูเหมือนว่าจะทำงานได้ตามที่คาดไว้ในการทดสอบ:

www.mydomain.com/path/to/some/script.php?parm=foo

อย่างถูกต้อง 301 ถึง:

www.mydomain.com/simple-url-foo.html

อย่างไรก็ตาม ข้อกังวลของฉันคือหากไม่มี RewriteCond กำหนดสคริปต์อย่างชัดเจน เงื่อนไขนี้จะได้รับการตรวจสอบในทุกคำขอ ไม่ว่าจะเป็นสำหรับ some_script.php... ซึ่งนำไปสู่โหลดที่ไม่จำเป็นบน Apache หรือไม่

เป็นกรณีนี้หรือไม่? หากเป็นเช่นนั้น ฉันมีปัญหาในการหาวิธีใช้ REQUEST_URI ในกรณีนี้ IE:

RewriteCond %{REQUEST_URI} ^path/to/some_script.php [NC]
RewriteCond %{QUERY_STRING} ^parm=([a-z]+)$ [NC]
RewriteRule ^path/to/some_script.php /simple-url-$1.html? [R=301,L]

ดูเหมือนว่าข้างต้นจะไม่ทำงาน และฉันไม่แน่ใจว่าทำไม พอยน์เตอร์ใด ๆ ?


person JR.XYZA    schedule 23.08.2013    source แหล่งที่มา


คำตอบ (1)


คำตอบสั้นๆ คือ เงื่อนไข %{REQUEST_URI} นั้นไม่จำเป็น

การเพิ่มเงื่อนไขถือเป็นการย้ายการเปรียบเทียบ URI ของคำขอให้เกิดขึ้นก่อนสตริงการสืบค้น มันยังคงถูกเปรียบเทียบกับทุกคำขอที่เข้ามา อันที่จริง สิ่งนี้ทำให้สถานการณ์แย่ลงในขณะนี้ เนื่องจากการเปรียบเทียบสำหรับ some_script.php จะเกิดขึ้นสองครั้ง หนึ่งครั้งใน RewriteCond และอีกครั้งหนึ่งใน RewriteRule

และด้วยการตั้งค่าเดิมของคุณ URI คำขอทั้งหมดไม่ได้ถูกตรวจสอบสำหรับ some_script.php %{QUERY_SRING} ยังช่วยให้แน่ใจว่าการเปรียบเทียบเกิดขึ้นเฉพาะกับคำขอที่มาพร้อมกับพารามิเตอร์การค้นหา parm เท่านั้น

person Ravi K Thapliyal    schedule 23.08.2013
comment
@anubhava ขอบคุณครับพี่ เฮ้ ฉันมีเรื่องอยากจะถามนิดหน่อย :) คุณช่วยเข้าไปที่คำตอบนี้ได้ไหม และดูว่าคุณสามารถหาคำตอบว่าทำไมคำตอบที่ยอมรับจึงใช้ได้ผลหรือไม่ และของฉันไม่ใช่ ฉันฝากคำถามไว้กับจอน ลิน แต่เขาเลือกที่จะไม่ตอบ มันรบกวนฉันแล้ว! ขอบคุณ :) - person Ravi K Thapliyal; 23.08.2013
comment
แน่นอนว่าเจ้านาย ฉันจะให้คำตอบภายในไม่กี่นาทีหลังจากวิเคราะห์แล้ว - person anubhava; 23.08.2013
comment
@RaviThapliyal ขอบคุณมากสำหรับคำแนะนำ! จากสิ่งที่คุณพูดในใจ มีวิธีปรับปรุงการเขียนซ้ำเพื่อประเมินกฎนี้เฉพาะเมื่อพารามิเตอร์ parm จับคู่กับ some_script.php หรือไม่ ในกรณีที่มีสคริปต์/เพจอื่นที่มีชื่อพารามิเตอร์คล้ายกัน - person JR.XYZA; 23.08.2013
comment
@ JR.XYZA นั่นคือสิ่งที่เกิดขึ้นอย่างแน่นอน %{QUERY_STRING} ขั้นแรกตรวจสอบว่ามี parm อยู่หรือไม่ และ หากใช่ ให้ตรวจสอบว่าไฟล์ที่ร้องขอนั้นเป็น some_script.php หรือไม่ นี่เป็นเช็คเพียงสองรายการที่จำเป็นในการเริ่มกฎ ไม่มาก ไม่น้อย - person Ravi K Thapliyal; 24.08.2013