. Htaccess mod RewriteRule ve imi

4 Cevap php

Ben şu anda iki gün boyunca bu mücadele ettik.

Şu anda ben aşağıdaki yeniden yazma kuralı vardır:

RewriteRule ^(.*)$ index.php?u=$1 [NC,L]

Hangi GET değişkeni u gibi index.php example.com / arkasında bağlantı noktaları her şey. Ile index.php işleniyor hangi bir varlık te farklı argümanları tanımlamak için patlayabilir: konuma tr (ilk bölü arasında) şehir (ikinci argüman)

THis aşağıdaki URL'ler için mükemmel çalışıyor:

example.com/City/location/ or example.com/City/location
example.com/City/ or example.com/City

Üretir:

$arg[0] = city
$arg[1] = location

Konum konum adına bir Ampersand olduğunda sorun olmuyor:

example.com/city/location&more

çevirir:

index.php?u=city/location&more

Sorun açıktır; yer adının ikinci bölümü $ _GET ['u'] saklı değildir çünkü ben artık index.php patlayabilir parametresini kullanamazsınız.

I bu nasıl çözebilir?

I think of three solutions which i don't know how to implement:
1) rewriting the rewrite rule to split the city and location in the .htaccess
2) using a .htaccess equivalent of urlencode to transform the &-sign to %26
3) a complete other solution:)
Thanx in advance!

Edit Firstly: When the link is being produced by my website it gets translated with urlencode. So there isn't a & where there shouldn't be one. The & is part of a business namen like: "Bagels&Beans" When people want to search that company they type: www.example.com/city/bagels&beans in the url-field. ANd that is where the problem starts.

edit 2 When i go to: example.com/city/bagels%26Beans it translates to the following: $_GET:

Array
(
    [u] => city/Bagels
    [Beans] => 
)

edit 3 The way i explode the $_GET['u'] to form the arguments.

$arg = explode('/',$_GET['u']);

4 Cevap

Sen bir argüman URL yolunu koymak gerekmez. Sadece bu gibi orijinal istenen yolu ayrıştırmak:

$_SERVER['REQUEST_URI_PATH'] = strtok($_SERVER['REQUEST_URI'], '?');
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));

Şimdi tüm ihtiyacınız için isteğinizi yeniden yazmak için bu kural index.php:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ index.php [L]

Ek koşul yalnızca varolan dosyalarla eşlenir edilemez istekleri yeniden yazmak için.

İlk şeyler:

example.com/city/location&more

geçerli bir sorgu dizesi değil. Sen ? ile sorgu dizeleri başlamak gibi pek olmalıdır:

example.com/city/location?more=value&more2=value2

İkincisi, sorgu dizeleri QSA (sorgu dize eklemek anlamına gelir) olan sizin yeni yeniden yazılamaz URL'ler, ekli olsun sağlamak için mod_rewrite bir değiştirici vardır. Sizin yazma kuralı gibi görünecektir:

RewriteRule ^(.*)$ index.php?u=$1 [NC,QSA,L]

Bunun yerine, gerçek $ _GET argüman $ _SERVER ["REQUEST_URI"] kullanmayı deneyebilirsiniz.

if(preg_match("%\?u=(.*)$%", $_SERVER["REQUEST_URI"], $Matches)) {
    $Test = explode("/", $Matches[1]);
    var_dump($Test);
}

Için "index.php u = test / testlocation ve daha?" Bu irade çıktı:

array (2) {[0] => string (4) "test" [1] => string (17) "testlocation & more"}

Sen & bir URL parçası olarak tam da bu nedenle olmamalıdır. & özel bir anlamı vardır, ve, sitenizde bir a etiketi koymak herhangi bir zamanda ({[) (2]} için) urlencoded gerektiğini görmek asla böyle aslında URL & olarak gelir.

Temelde, ben ne söylüyorum, bir & bir URL parçası olarak çıkış için izin veriyor kötü olursa olsun kod olarak bu idare, sizin htaccess bu ele kalmamasıdır.