URL ที่เขียนซ้ำที่มีความยาวพารามิเตอร์> 255 ไม่ทำงาน


12

ฉันใช้ mod_rewrite เพื่อเขียน URL เช่นนี้:

http://example.com/1,2,3,4/foo/

โดยทำสิ่งนี้ใน. htaccess:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

มันทำงานได้ดียกเว้นเมื่อ "1,2,3,4" เปลี่ยนเป็นสตริงที่มีความยาวมากกว่า 255 ตัวอักษร Apache จะส่งคืน "403 Forbidden"

ไม่มีปัญหาในการเยี่ยมชมfoo.php?id=1,2,3,4โดยตรงแม้จะมีสตริง id ยาวมาก แต่นี่ไม่ใช่ตัวเลือกสำหรับฉัน

มี Apache หรือการตั้งค่าอื่น ๆ ที่ฉันควรปรับแต่งหรือไม่?

อัปเดต : ฉันเปิด RewriteLog ด้วย RewriteLogLevel 9. ด้วยสตริง id สั้น ๆ ฉันได้หลายบรรทัดในไฟล์บันทึกของฉัน แต่เมื่อสตริง id มากกว่า 255 ตัวอักษรไม่มีสิ่งใดที่ถูกบันทึกไว้ (ดูเหมือนว่า mod_rewrite จะไม่ทำงานด้วยซ้ำ)

หากคุณพบว่าคำถามนี้น่าสนใจ / เป็นประโยชน์โปรดโหวตขึ้น


อาจเป็นปัญหา regex หรือไม่ คุณได้ตรวจสอบว่าคำขอที่เขียนใหม่นั้นถูกต้องสำหรับสตริงที่ยาวกว่า 255 อักขระหรือไม่ ถ้าไม่เช่นนั้นคุณอาจโพสต์คำขอก่อนและหลังเขียนใหม่ก็ได้
tomjedrz

3
เปิดใช้งานการบันทึกของ mod_rewrite ด้วยRewriteLogและRewriteLogLevelเพื่อให้คุณสามารถเห็นสิ่งที่ตรงกันและวิธีการเขียนใหม่ ฉันเดาว่ามีเพียง 255 ตัวอักษรเท่านั้นที่ถูกคัดลอก$1และกลายเป็นidว่าลูกค้าไม่ได้รับอนุญาตให้ดูดังนั้น Apache จะคืนค่า 403 ฉันไม่ได้ดูรหัส แต่อาจเป็นไปได้ว่า Apache ปรุงแต่ง backreference ในบัฟเฟอร์ 256- ไบต์คงที่ (256 สำรองไว้สำหรับการยกเลิก NULL)
James Sneeringer

ดูการอัปเดตที่มีคำถาม - ไม่มีสิ่งใดถูกบันทึกไว้สำหรับ params ที่ยาวนาน
philfreo

คำตอบ:


8

คุณคิดว่าคุณกำลังใช้งานข้อ จำกัด ของระบบไฟล์หรือไม่?

อาจเป็นความยาวชื่อไฟล์สูงสุดคือ 255 ไบต์และเมื่อ apache หรือกฎ mod_rewrite ตรวจสอบว่าไฟล์มีข้อผิดพลาดจะถูกส่งกลับไปยัง apache โดยระบบปฏิบัติการ

หากคุณวางกฎบางอย่างไว้ในไฟล์. htaccess ของคุณมันสายเกินไปที่จะแก้ไขปัญหา Apache จะพยายามจัดทำชื่อไฟล์และข้อผิดพลาดของระบบไฟล์ '(36) ชื่อไฟล์ยาวเกินไป' แล้วส่งคืนข้อผิดพลาด 403

บางทีคุณอาจเปลี่ยนรูปแบบ URL ภายในแอปของคุณ มากถึง 255 ตัวอักษรจากเครื่องหมายสแลชเพื่อเฉือน

แก้ไข: ดูที่นี่สำหรับคำตอบโดยละเอียดเกี่ยวกับปัญหานี้ ฉันยืมของฉันจากที่นั่น


ใช่นี่คือสิ่งที่เราสามารถทำได้ในตอนนี้ฉันหวังว่าจะได้รับการแก้ไขหรือปรับแต่ง
philfreo

3
Microspino, ดูเหมือนว่าคุณตัดและวางส่วนหนึ่งของคำตอบของคุณจากคำตอบ @ Jeff คลาร์กที่นี่: serverfault.com/questions/120397/... คุณควรเชื่อมโยงหลายมิติเข้ากับคำตอบนั้นเพื่อให้เขาได้รับชื่อเสียงในทางลบ
Stefan Lasiewski

@Stefan lasieswski: คุณพูดถูกฉันเพิ่มการอ้างอิง
microspino

ดังนั้นคุณคิดว่าบางที Apache กำลังพยายามจัดทำไฟล์ที่ร้องขอโดยไม่คำนึงถึง - ฉันหมายถึงนั่นอาจเป็นวิธีเดียวที่จะอธิบายได้ว่า URL ที่ยาวเกินไปนั้นไม่ได้ถูกหยิบขึ้นมาโดย
เอ็นจิ้น

ใช่นี่คือความคิดของฉันแม้ว่าฉันคิดว่าโดยทั่วไปแล้วมี URL และชื่อไฟล์ที่ยาวมากควรหลีกเลี่ยงด้วยเหตุผลหลายประการ ดังนั้นคำแนะนำที่ดีที่สุดที่ฉันคิดได้ก็คือเปลี่ยนบางสิ่งในรูปแบบ URL หากชื่อไฟล์ไม่ยาวเกินไป
microspino

2

มีคำถามที่คล้ายกันเกี่ยวกับขีด จำกัด นี้ได้ที่นี่ :

คุณอาจพบข้อ จำกัด ของระบบไฟล์พื้นฐาน

ฉันไม่ทราบว่าคุณกำลังใช้ REQUEST_FILENAME อยู่ที่ไหนสักแห่งในการกำหนดค่า. htaccess ของคุณดังนั้นไม่ทราบว่าโซลูชันที่ให้มาจะใช้งานได้หรือไม่


ที่เหมาะสม แต่ไม่ฉันไม่ได้ ฉันแก้ไขคำถามของฉันเพื่อรวมไฟล์. htaccess ไว้ครบถ้วน ความคิดอื่น ๆ ?
philfreo

ตามที่ "Apache mod_rewrite รายละเอียดทางเทคนิค" ที่httpd.apache.org/docs/trunk/rewrite/tech.html "ถึงแม้ว่า mod_rewrite จะเขียน URL ใหม่ไปยัง URL, URL ไปยังชื่อไฟล์และแม้กระทั่งชื่อไฟล์ไปยังชื่อไฟล์ API ในปัจจุบันมีเพียง URL-to ตะขอชื่อไฟล์ ". ดังนั้นแม้ว่าคุณจะไม่ได้กดไฟล์จริง ๆ แต่บางที URL ของชื่อไฟล์คือ hook ถึงขีด จำกัด ทรัพยากร OS?
Stefan Lasiewski

0

คำถามที่น่าสนใจแน่นอน คุณรัน mod_security หรือไม่ถ้าเป็นเช่นนั้นลองโดยไม่ใช้มันหรือไม่? บางทีมันอาจไม่ชอบชื่อพา ธ ยาวหรือชื่อพา ธ ยาวที่มีเครื่องหมายจุลภาคที่ไม่เข้ารหัส ^^

แม้ว่ามันจะรู้สึกเหมือนสัญชาตญาณขีด จำกัด บนเส้นทาง url หรืออย่างน้อยแต่ละเซ็กเมนต์ของมันหรือการตีความระบบไฟล์พื้นฐานของมันตามที่ GmonC เขียน นั่นจะอธิบายว่าทำไม URL ปกติที่มีส่วนยาวในสตริงการสืบค้นจึงทำงานได้ดี

ฉันคิดว่า ASP.NET ที่เก่ากว่าเคยมีการ จำกัด พา ธ คำขอที่มีประมาณ 260 ตัวอักษรหรือบางสิ่งบางอย่างเช่นกัน


ดูการอัปเดตคำถาม และไม่ฉันไม่เห็นไฟล์ mod_security ใน/usr/include/apache2/หรือ/usr/lib/apache2/modules/(แต่ฉันเห็น mod_rewrite ที่นั่น) ดังนั้นฉันคิดว่ามันไม่ได้ติดตั้ง
philfreo

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