/ 123 ve /? 123 arasındaki fark nedir?

7 Cevap php

Ben (eski http://careers.stackoverflow.com 1,0 dahil) bazı siteler bu gibi bakmak sorgu dizeleri olduğunu fark ettik:

http://somewebapp.example/?123

göre şu şekilde:

http://somewebapp.example/123 veya http://somewebapp.example/id/123

Geliştiriciler yerine ikinci ve üçüncü örneklerde ilk örneğini kullanarak kendi web uygulamalar 'URL'leri uygulamak için tercih nedenleri nelerdir?

Ve bir bonus olarak, nasıl bir 123, bir veritabanı tablosundaki bazı satırın birincil anahtar olduğu göz önüne alındığında, PHP ilk örneğini uygulamak istiyorsunuz? (Ben sadece URL'den 123 nasıl alınacağını bilmek gerekir, ben zaten 123 bir birincil anahtarı için veritabanını sorgulamak için biliyorum.)

EDIT [5/28]: Oops, herkes nasıl çalıştıklarını, son iki URL'ler ne olduğunu bilmek ve nasıl bunları uygulamak olduğunu bildirmek için unuttum. Olsa hatırlatmalar için teşekkürler, ben tesadüfen yine açıklık getirilmiş bazı ilgisiz yanlış olduğunu düşünüyorum!

7 Cevap

İlk uygulamak daha kolaydır; sonra her şeyi? sorgu dizesinin parçasıdır. Web sunucusu önce? Belirtilen sayfasını yükler, ve (PHP o $_GET ile erişilebilir) ayrı ayrı sorgu dizesi kolları

İkinci örnekte geliştirici (sunucuda /123 sayfa olduğundan) daha sonra ne olduğunu anlamaya URL ayrıştırma, hangi özel bir sayfa tüm isteklerini yönlendirmek için web sunucusu kurmak gerekiyor Talep

Son soruya ilişkin olarak, 123 böylece key($_GET) bunu geçen konum tek şey varsayarak işe, bir anahtar olarak $_GET görünecektir Sorgu dizesi

Sen kullanarak php erişebilirsiniz

$_SERVER['QUERY_STRING']

İlk örnek bir sorgu dizesi; İkinci ve üçüncü örnekler değildir. URL'ler hakkında daha fazla bilgi What Every Developer Should Know About URLs. Sorgu dizesinden id kullanmak için, uygun bir kütüphane kullanarak ayrıştırmak gerekiyor.

Geliştiriciler yerine ikinci ve üçüncü örneklerde ilk örneğini kullanarak kendi web uygulamalar 'URL'leri uygulamak için tercih nedenleri nelerdir?

Estetik. cool URIs URI tasarımı nasıl bazı iyi öneriler almak üzere okuyun.

nasıl bir PHP ilk örneğini uygulamak istiyorum

Sen $_SERVER['PATH_INFO'] arıyor ama dikkat ediyoruz: bazı hosting sağlayıcıları orada sahte şeyler koymak.

Bu durumlarda, mod_rewrite veya benzeri kullanmanız gerekir ..

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(\d+) /index.php?id=$1 [L,QSA]

Bu şekilde, $_GET['id'] dışarı kimliği alabilirsiniz

Bu aslında modRewrite kuralları veya apache yapılandırmaları ile ilgisi yoktur. Kod Ateşleyici gibi bazı çerçeveler gerçekten teknik olarak fiziksel konumda bulunmayan bir sayfaya yönlendirmek için bu yolları kullanın. Bu ayrıştırılır ve çerçeve görüntülemek için Approrpriate hangi görünümü belirler. Bazı kurallar geçerli bir rota çerçevesinde mevcut ise web sunucusu belirlemek için bir parametre olarak / dan sonra bir şey geçmesine izin verir. Bazı sistemler otomatik olarak bunu yapmayın ve bu yüzden bir soru işareti yol olarak çerçeveye geçirilecek zorlamak yerleştirilir

Eğer istek QUERY_STRING çekmek için gereken ilk örneğinden 123 almak istiyorsanız

İlk URL veri göndermek için sorgu parametreleri kullanıyor. Daha sonra aslında ID 123 ile bir kaynağa işaret REST URL şeklidir

Apache kullanıyorsanız (ve diğer sunucularda aynı şeyi yapabilirsiniz, ama ayrıntıları bilmiyorum) varsa, bu satırlar boyunca bir şey ilginç bir hile yapacak:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php/$1
</IfModule>

Kural: istenen sayfa bir dosya değilse !-f ya da bir dizin !-d, sonra yerine veren bir page not found hatası, yük index.php ve $_SERVER['PATH_INFO'] (o da $_SERVER['REQUEST_URI'] elde edilebilir şeklinde bu komut üzerine, istenen yolu geçmektedir.

Yoksa yol $_SERVER['QUERY_STRING'] elde edilebileceği durumda, index.php?$1 için yeniden yazmak için Apache söylemek olabilir. (Bu durumda, bir şey karışıklık olmadan geçerli sorgu dizesi (varsa) eklemek için QSA argümanını kullanmanız gerekir.