Nasıl geçebilir "/"

3 Cevap php

ÇÖZÜLDÜ:

Bu URI çalışır:

/controller/action?ret=%2F

Ben denetleyici eylem ek bir "/" parametresi geçmek istiyorum. Yani bu yaptım:

$par1 = urlencode('/');
$this->_redirect('/controller/action/par1/' . $par1);

Ama bu hata mesajını alıyorum:

Not Found

The requested URL /controller/action/ret// was not found on this server.

Ben herhangi bir parametre olmadan veya parametre "aaa" ile denetleyicisi eylem çağırdığınızda çalışır. Bu URI'lar çalışır:

/controller/action
/controller/action/par1/aaa
/controller/action/par1/jfhsdajkhfui454fs
/controller/action/par1
/controller/action/par1/

Eğer yukarıdaki göreli URI önünde http://example.com koyabilirsiniz ve bu aynı.

3 Cevap

Neredeyse doğru yapıyorsun. Sadece hafif bir hata urlencode sorgu parametreleri ve yol değil parçası sadece uygun olan bir alan, belirtmek için bir artı kullanmayı tercih olacaktır. rawurlencode burada daha iyi olurdu.

Ancak, bu işe yaramazsa nedeni değildir. Zaten doğru olan, /controller/action/par1/%2F yolunu üreten.

Apache dizin geçişi sorunları (oldukça etkisiz bir şekilde) sizi korumaya çalışıyor çünkü sizin için pratikte çalışmıyor. Eğer bir URL yolu bir %2F dizisini eklerseniz, Apache ve varsayılan atlama tarafından kendi 404 sayfa (herhangi bir ErrorDocument ayarları sayarak) gösterecektir. Bu özelliği açmak için (IMO: misfeature) kapalı, sen AllowEncodedSlashes yapılandırma yönergesini kullanabilirsiniz.

O geri komut geldiğinde aslında kodlanmış bölü alabilirsiniz olsun solucanlar başka tenekesi. Nedeniyle orijinal CGI spec PATH_INFO değişkeni kötü tasarım, birçok ortamlarda bir şifresiz farklı şey olarak %2F görmek mümkün olmayacaktır {[(2) }], potansiyel olarak yol parçaları yapıyoruz yönlendirme kırıyor.

Bu Apache onlar tarafından karıştı alacak yalnızca sunucu veya dil olmadığı için, yol kesimlerinde eğik önlemek için en iyi genellikle. Genel olarak size yol parçalar (a) /, (b) {[birçok sunucularında pratik sorunları var çünkü, bayt veya herhangi bir karakter dizesini kabul etmek gerekiyor giriş için sorgu parametreleri kullanmak gerekir (1)]}, (c) boş karakter ve (d) boş dizeler.

Try %2F. I urlencode geçerli URL sözdizimi çünkü '/' kodlamak için gidiyor sanmıyorum.

[Edit]: oy takdir ama benim cevap yanlış görünüyor. Bobince en doğru (ve çok daha detaylı) cevabı below Yukarıdaki bakın.