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,4
langsung, 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.
sumber
RewriteLog
danRewriteLogLevel
agar 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 menjadiid
bahwa 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).Jawaban:
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.
sumber
Ada pertanyaan serupa tentang batas ini di sini :
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.
sumber
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.
sumber
/usr/include/apache2/
atau/usr/lib/apache2/modules/
(tapi saya melihat mod_rewrite di sana) jadi saya berasumsi itu tidak diinstal.Apakah Anda bersedia mengubah server http? Pertimbangkan nginx daripada apache.
Dan gunakan http://wiki.nginx.org/NginxHttpRewriteModule
sumber