PHP için Yeniden Yazma $ _GET ve URL

7 Cevap php

Nasıl URL yeniden PHP $ _GET parametresini etkiler? Örneğin, ben http://example.com/index.php?p=contact gibi bir URL var ve kontak sayfası sunmak için index.php anlatmak için $ _GET ['p'] kullanın, söyleyin. I http://example.com/contact, $ olacak _GET ['p'] için URL dönüştüren bir yeniden yazma kuralı kullanıyorsanız beklendiği gibi hala çalışır? Öyle ise, neden çalıştığını ayrıntılı olabilir. Değilse, hangi stratejileri sayfa ve yeniden yazma olmadan hem de çalışacak şekilde sorunu çözmek için kullanılan olabilir?

7 Cevap

Beklendiği gibi Evet, o çalışacaktır.

Ben beklendiği gibi "Evet, o mostly çalışacaktır." Için Grant'ın cevabını değişiklik istiyorum

Özellikle, mevcut sorgu dizeleri getirmedi mod_rewrite 'davranışı şaşırtıcı olabilir. Bir örnek olarak, size verilen URL dönüştürür aşağıdaki kural, atalım:

RewriteRule /contact /index.php?p=contact

Bu doğru /contact /index.php?p=contact yeniden yazma ve sayfa adı $_GET['p'] erişilebilir olacaktır. Eğer sayfa adı dışında diğer parametreler kullanan bir komut ile bu tekniği kullanmak Ancak, biraz yanıltıcıdır alır. Bu kural aynı zamanda /contact?person=Joe /index.php?p=contact çevirir. person=Joe parametresi tamamen kaybolur! Bu ile başa çıkmak için iki yol vardır.

Basit yolu özgün sorgu dizesi yer olacaktır üstünlüğü [QSA] ("sorgu dizesi append") bayrak, kullanmak için after çeviri kural verilen parametreler, {[ (2)]} ile /index.php?p=contact&person=Joe,

RewriteRule /contact /index.php?p=contact [QSA]

Ancak, bu mümkün sizin p= parametresi üzerine almak için yapar. Tatil /contact?p=about /index.php?p=contact&p=about için yeniden alacak, böylece $_GET['p'] sizin komut değil, "temas" "hakkında" dönecektir. Bu sorunu çözmek için, bunun yerine QUERY_STRING değişkeni kullanabilirsiniz:

RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact

Bu garanti o $_GET['p'] olacak always return "temas" ne olursa olsun ziyaretçiler URL'ler ile karıştırmasını olsun, bu kuralı kullanarak. :-)

Bir URL yeniden yazma zaman bu mod_rewrite'ı yapılır -? Sonunda alınan sayfa hala "eski" bir, yani index.php p = temastır. Diğer bir deyişle, tarayıcı / temas alır. mod_rewrite o zaman? p = temas index.php yeniden yazar. Nedeniyle bu komut dosyası, herhangi bir yeniden yazımı gerçekleştiğini bilmiyor - hala onun "her zamanki" yolu denir alır. Bu nedenle bu tür bir yeniden yazma çalışacaktır. Sen kaynak tarayıcı istenen olandan farklı bir sayfa istediğinde, bir yeniden vekil olarak düşünmek isteyebilirsiniz.

Istemci istekleri http://example.com/contact, sunucu http://example.com/index.php?p=contact yerine onlara hizmet için yeniden yazma kuralı kullanır. İstemci yeniden yazılamaz URL'sini görmek mümkün olmayacak ve hatta yeniden yazılması olduğunu söylemek mümkün olmayabilir. Istemci olarak URL'sini istekte size aynı sayfayı verecekti.

Bu sayfanın render parçaları yaptıktan sonra başlıklarını değiştirerek php sayfaları vida ups neden böyle değil mi? Nasıl URL yeniden mi? Belki ben yanlış ...

Beklendiği gibi yani evet, bu iş olacak, /index.php?p=contact için /contact URL'yi yeniden yazmak.

Durumda da işe yaramaz. mod_rewrite, bir eşleşme bulur ve bir iç yönlendirme yapar, http://example.com/index.php?p=contact http://example.com/contact için yeniden yazar sonra. Hatta yönlendirme sonrasında, yeni, yeniden yönlendirilen URI, hala bir durum ile eşleşen ve daha yönlendirilir olabilir.

Her durumda, gelen URI'larını bellekte tutulur değil, bu yüzden bile Apache özgün tanım ne yeniden yapabilirsiniz. PHP, bu idam ediyor zaman, aynı zamanda özgün URI bilmiyor. Bu nedenle, aracılığıyla gönderilen değişkenler GET, şimdi oldu dönüştürülmüş URL, içerdiği gibi, senin $ _GET değişkenler gevşek ve PHP gelen istekleri ayrıştırma ilişkisel $ _GET dizi doldurur.

Hem destek veren zahmetli olacaktır. Eğer varsa http://domain.com/segment1/segment2/segment3 Eğer anlamlı bir şeyle kesimleri ilişkilendirmek gerekir. Eğer etki şerit ve '/' üzerinde patlayabilir, ve eğer ilk bölüm sayfayı istediğinde, ve gelen http://example.com/contact/, sayfa = 'temas' ayıklamak olduğunu söyleyebiliriz istiyorum