255'ten fazla parametre uzunluğuna sahip yeniden yazılmış URL'ler çalışmıyor


13

Bunun gibi URL'leri yeniden yazmak için mod_rewrite kullanıyorum:

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

Bunu .htaccess içinde yaparak:

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

"1,2,3,4" 255 karakterden daha uzun bir dizgeye dönüşmesi dışında Apache "403 Yasak" değerini döndürür.

foo.php?id=1,2,3,4Çok uzun bir kimlik dizesiyle bile doğrudan ziyaret etmekte sorun yok , ancak bu benim için bir seçenek değil.

Ayarlamam gereken bazı Apache veya başka bir ayar var mı?

GÜNCELLEME : RewriteLogLevel 9 ile RewriteLog'u açtım. Kısa bir kimlik dizesiyle günlük dosyamda birkaç satır alıyorum. Ancak id dizesi 255 karakterden büyük olduğunda, hiçbir şey günlüğe kaydedilmez (mod_rewrite bile yürütülmüyor gibi görünüyor mu?).

Bu soruyu ilginç / yararlı buluyorsanız lütfen oy verin.


Bu normal bir sorun olabilir mi? Yeniden yazılan isteğin 255 karakterden uzun dizeler için doğru olup olmadığını kontrol ettiniz mi? Değilse, belki de yeniden yazma öncesi ve sonrası istekleri gönderebilirsiniz.
tomjedrz

3
İle mod_rewrite en günlüğünü etkinleştirin RewriteLogve RewriteLogLevelböylece eşleşti ediliyor ve gerçekten nasıl yeniden ediliyor ne görebilirsiniz. Ben sadece 255 karakter kopyalanıyor $1ve idmüşteri görmek için yetkili olmadığı bir sonuç, yani Apache 403 döndürür tahmin ediyorum. Ben koda bakmadım, ama Apache manipüle olabilir 256 baytlık sabit bir arabellekteki geri başvuru (256. sonlandırma NULL için ayrılmıştır).
James Sneeringer

Söz konusu güncellemeye bakın - uzun parametreler için hiçbir şey kaydedilmedi
philfreo

Yanıtlar:


8

Dosya sisteminin bir sınırlamasıyla karşılaştığınızı mı düşünüyorsunuz?

Maksimum dosya adı uzunluğu 255 bayt olabilir ve apache veya mod_rewrite kuralı dosyanın var olup olmadığını kontrol ettiğinde, işletim sistemi tarafından apache'ye bir hata döndürülür.

.Htaccess dosyanıza bir kural koyarsanız, soruna geçici bir çözüm bulmak için çok geç. Apache, dosya adını ve atılan dosya sistemi hatasını '(36) Dosya adı çok uzun' olarak ayarlamaya çalıştı ve 403 hatası verdi.

Belki uygulamanızın içindeki URL modelini değiştirebilirsiniz. eğik çizgiden eğik çizgiye kadar en fazla 255 karakter.

EDIT: Bu soruna ayrıntılı bir cevap için buraya bakın. Oradan benimkini ödünç aldım.


Evet, şu anda yapabileceğimiz tek şey budur, ancak bir çözüm bulmayı veya ayarlamayı umuyorum.
philfreo

3
Microspino, Görünüşe göre @Jeff Clark'ın cevabından cevabınızın bir kısmını kesip yapıştırdınız: serverfault.com/questions/120397/… . Bu cevaba hiperlink vermelisin, böylece biraz ün kazanıyor.
Stefan Lasiewski

@Stefan lasieswski: haklısın, bir referans ekledim.
microspino

bu yüzden, Apache'nin istenen dosyayı dikkate almaya çalıştığını düşünüyorsunuz - yani, çok uzun URL'nin yeniden yazma motoru tarafından alınmadığını açıklamanın tek yolu bu olabilir ...
HorusKol

Evet, bu benim fikrim, ancak genel olarak bu kadar uzun URL'lerin ve dosya adlarının birkaç nedenden dolayı kaçınılması gerektiğini düşünüyorum. Dosya adı zaten çok uzun değilse, belki de düşünebileceğim en iyi tavsiye URL kalıbındaki bir şeyi değiştirmektir.
microspino

2

Burada bu sınırla ilgili benzer bir soru var :

Temel dosya sisteminin bir sınırlaması ile karşılaşıyor olabilirsiniz

REQUEST_FILENAME içinde bir yerde .htaccess yapılandırması kullanıp kullanmadığınızı bilmiyorum, bu nedenle sağlanan çözümün işe yarayıp yaramayacağını bilmiyorum.


Bu mantıklı, ama hayır, ben değilim. Sorumu .htaccess dosyasını bütünüyle içerecek şekilde düzenledim. Diğer fikirler?
philfreo

Httpd.apache.org/docs/trunk/rewrite/tech.html "adresindeki" Apache mod_rewrite Teknik Ayrıntıları " ne göre mod_rewrite URL'leri URL'lere, URL'leri dosya adlarına ve hatta dosya adlarını dosya adlarına yeniden yazsa da, API şu anda yalnızca URL'ye -filename hook. " Gerçek bir dosyaya vurmamanıza rağmen, dosya adı kancasının URL'si OS kaynak sınırına vuruyor olabilir mi?
Stefan Lasiewski

0

Kesinlikle ilginç bir soru. Mod_security'yi çalıştırıyor ve öyleyse onsuz denediniz mi? Belki de uzun yol isimlerini veya kodlanmamış virgül içeren uzun yol isimlerini sevmez? ^^

İçgüdüsel olarak daha çok url yolu veya bunun en azından bireysel segmentleri veya GmonC'nin yazdığı gibi temel dosya sistemi yorumu üzerinde bir sınır gibi hissediyor. Bu, sorgu dizesinde uzun kısmı olan normal URL'nin neden iyi çalıştığını da açıklar.

Eski ASP.NET, ~ 260 karakter ya da bir şey istek yolu sınırı için kullanılan düşünüyorum.


Soru güncellemesine bakın. Ve hayır, ben bir mod_security dosyası görmüyorum /usr/include/apache2/veya /usr/lib/apache2/modules/(ama orada mod_rewrite görüyorum) bu yüzden yüklü olmadığını varsayıyorum.
philfreo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.