URL yang ditulis ulang dengan panjang parameter> 255 tidak berfungsi

12

Saya menggunakan mod_rewrite untuk menulis ulang URL seperti ini:

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

Dengan melakukan ini di .htaccess:

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

Ini berfungsi dengan baik, kecuali ketika "1,2,3,4" berubah menjadi string yang lebih panjang dari 255 karakter, Apache mengembalikan "403 Forbidden".

Tidak ada masalah mengunjungi foo.php?id=1,2,3,4langsung, bahkan dengan string id yang sangat panjang, namun ini bukan pilihan bagi saya.

Apakah ada beberapa Apache atau pengaturan lain yang harus saya atur?

UPDATE : Saya mengaktifkan RewriteLog dengan RewriteLogLevel 9. Dengan string id pendek, saya mendapatkan beberapa baris dalam file log saya. Tetapi ketika string id lebih besar dari 255 karakter., Tidak ada yang dicatat (sepertinya mod_rewrite bahkan tidak mengeksekusi?).

Jika Anda menemukan pertanyaan ini menarik / bermanfaat, harap perbarui.

philfreo
sumber
Mungkinkah ini masalah regex? Sudahkah Anda memeriksa bahwa permintaan penulisan ulang sudah benar untuk string yang lebih panjang dari 255 karakter? Jika tidak, mungkin Anda dapat memposting permintaan sebelum dan sesudah penulisan ulang.
tomjedrz
3
Aktifkan pencatatan mod_rewrite RewriteLogdan RewriteLogLevelagar Anda dapat melihat apa yang dicocokkan dan bagaimana itu benar-benar ditulis ulang. Saya kira hanya 255 karakter yang sedang disalin ke dalam $1, dan yang akhirnya menjadi idbahwa klien tidak berwenang untuk melihat, jadi Apache mengembalikan 403. Saya belum melihat kode, tetapi bisa jadi itu memanipulasi Apache referensi balik dalam buffer 256-byte tetap (256-byte dicadangkan untuk NULL yang mengakhiri).
James Sneeringer
Lihat pembaruan yang dipermasalahkan - tidak ada yang dicatat untuk params panjang
philfreo

Jawaban:

8

Apakah Anda pikir Anda mengalami keterbatasan sistem file?

Mungkin panjang nama file maks adalah 255 byte dan ketika apache atau aturan mod_rewrite memeriksa apakah file tersebut ada kesalahan dikembalikan ke apache oleh sistem operasi.

Jika Anda memasukkan beberapa aturan dalam file .htaccess Anda, sudah terlambat untuk menyelesaikan masalah. Apache akan sudah mencoba untuk mendaftarkan nama file dan melemparkan kesalahan sistem file '(36) Nama file terlalu lama', mengembalikan kesalahan 403.

Mungkin Anda bisa mengubah pola URL di dalam aplikasi Anda. hingga maksimal 255 karakter dari garis miring ke garis miring.

EDIT: lihat di sini untuk jawaban terperinci untuk masalah ini. Saya meminjam milik saya dari sana.

mikrosino
sumber
Ya, ini saat ini yang bisa kita lakukan, saya berharap untuk solusi atau pengaturan tweak sekalipun.
philfreo
3
Microspino, Sepertinya Anda memotong dan menempelkan sebagian jawaban Anda dari jawaban @Jeff Clark di sini: serverfault.com/questions/120397/… . Anda harus hyperlink ke jawaban itu, sehingga dia mendapat ketenaran.
Stefan Lasiewski
@Stefan lasieswski: Anda benar, saya menambahkan referensi.
microspino
jadi, Anda berpikir mungkin Apache sedang mencoba membuat stat file yang diminta - maksud saya, itu bisa menjadi satu-satunya cara untuk menjelaskan bahwa URL yang terlalu panjang bahkan tidak diambil oleh mesin penulisan ulang ...
HorusKol
Ya ini adalah ide saya, walaupun saya berpikir bahwa secara umum memiliki url dan nama file yang begitu lama harus dihindari karena sejumlah alasan. Jadi saran terbaik yang bisa saya pikirkan adalah mengubah sesuatu dalam pola URL jika nama file belum terlalu panjang.
microspino
2

Ada pertanyaan serupa tentang batas ini di sini :

Anda mungkin mengalami keterbatasan sistem file yang mendasarinya

Saya tidak tahu apakah Anda menggunakan REQUEST_FILENAME di suatu tempat di dalam Anda. Konfigurasi htaccess, jadi tidak tahu apakah solusi yang disediakan akan bekerja.

GmonC
sumber
Itu masuk akal, tetapi tidak, saya tidak. Saya mengedit pertanyaan saya untuk memasukkan file .htaccess secara keseluruhan. Ide lain?
philfreo
Menurut "Rincian Teknis Apache mod_rewrite" di httpd.apache.org/docs/trunk/rewrite/tech.html "Meskipun mod_rewrite menulis ulang URL ke URL, URL ke nama file dan bahkan nama file ke nama file, API saat ini hanya menyediakan URL untuk -filename hook. " Jadi, meskipun Anda tidak memukul file yang sebenarnya, mungkin URL untuk nama file yang memukul batas sumber daya OS?
Stefan Lasiewski
0

Pasti pertanyaan yang menarik. Apakah Anda menjalankan mod_security dan jika demikian, coba tanpanya? Mungkin tidak suka nama jalur panjang atau nama jalur panjang dengan koma tanpa kode di dalamnya? ^^

Meskipun secara naluriah terasa lebih seperti batas pada jalur url atau setidaknya segmen individu atau interpretasi sistem file yang mendasarinya seperti yang ditulis GmonC. Itu juga akan menjelaskan mengapa url reguler dengan bagian panjang dalam string kueri berfungsi dengan baik.

Saya pikir ASP.NET yang lebih tua dulu memiliki batas jalur permintaan ~ 260 karakter atau sesuatu juga.

Oskar Duveborn
sumber
Lihat pembaruan untuk pertanyaan. Dan tidak, saya tidak melihat file mod_security di /usr/include/apache2/atau /usr/lib/apache2/modules/(tapi saya melihat mod_rewrite di sana) jadi saya berasumsi itu tidak diinstal.
philfreo
0

Apakah Anda bersedia mengubah server http? Pertimbangkan nginx daripada apache.

Dan gunakan http://wiki.nginx.org/NginxHttpRewriteModule

JavaRocky
sumber
Betulkah? Tidak ada cara untuk melakukan ini di Apache?
philfreo