Apache mod_rewrite çift yönlendirme üzerinde sorgu dizesini kodlar


13

Sorgu dizelerinden geçerken Apache mod_rewrite'ın davranışıyla ilgili garip bir sorunla (bir hata, belki?) Karşılaştık.

Çoğaltmak için, varsayılan Apache yapılandırmasıyla temiz bir Ubuntu (oneiric) yüklemesi kurduk. Mod_rewrite özelliğini etkinleştirdik ve varsayılan site yapılandırmasında aşağıdakileri ekledik:

RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]

Test etmek için curl kullanıyoruz:

curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'

İlgili çıktı:

HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b

Gördüğünüz gibi, sorgu dizesi çift çıkışlıdır, bu yanlıştır. Bunu nasıl düzeltebileceğimizi bilen var mı? Denediğimiz birkaç şey:

  • [NE] ekleniyor. Bu bize doğru sorgu dizesini verir, ancak yolun çıkış yolu yoktur, bu da yeni sorunlara yol açar.
  • [NE, B] ekleniyor. Bu işin görünüyor, ama neden /arasındaki ave byolun parçaları kaçmış edebilirsiniz.
  • Sorgu dizesinin manuel olarak çıkışını kaldırma.

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    

    Ancak bu , sorgu dizesinde diyelim ki bir &ile bir kaçan &arasında ayrım yapamayacağımız anlamına gelir .

Güncelleme:

Bu hata raporu aynı sorunu açıklamaktadır. İlk yorum, sorunu düzelttiği anlaşılan bir taahhütle bağlantılıdır, ancak Pieter'in aşağıda söylediği gibi, aslında düzeltilmiş gibi görünmemektedir.

Yanıtlar:


7

Bu Apache'de bir hata gibi görünüyor. Bu hata raporu biraz dağınık, ancak sorununuzu tam olarak açıklıyor:

https://issues.apache.org/bugzilla/show_bug.cgi?id=34602

Bu sorunun farkındalar gibi görünüyor. Hata düzelttikleri iddialarına rağmen, bunu Apache 2.3.15 ile test ettim ve sorun hala var gibi görünüyor. Ayrıca Apache 2.3'ün bir beta sürümü olduğunu unutmayın, bu yüzden Apache 2.4 çıkana kadar düzeltmiş olsa bile sizin için bir faydası yoktur.


Apache 2.4.10 hala bunu yapıyor gibi görünüyor, ancak 2.4.1'de düzeltilmiş olması gerekiyordu .
Arjan

1
Hala 2.4.7'de görüyorum
François
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.