Bu mod_rewrite'ı veya PHP gibi bir dil ile dost / temiz / güzel URL'leri işlemek için daha iyi mi?

5 Cevap php

Benim ilk terbiyeli ölçekli PHP sitesi geliştiriyorum ve ben "doğru yolu" uygulamasında temiz / / dost oldukça URL'leri işlemek için (orada varsayarak hiç böyle bir şey) ne hakkında biraz kafam karıştı.

Ben onu görmek yolu, iki ana seçenek (Ben örnek olarak basitleştirilmiş bir sosyal haber sitesi kullanacağız) vardır:

1.. Tüm potansiyel URL'leri işlemek için mod_rewrite kullanın. Bu aşağıdaki benzer, fakat özdeş değildir görünecektir:

RewriteRule ^article/?([^/]*)/?([^/]*)/?([^/]*) /content/articles.php?articleid=$1&slug=$2
RewriteRule ^users/?([^/]*)/?([^/]*) /content/users.php?userid=$1&username=$2
RewriteRule ^search/?([^/]*)/? /content/search.php?query=$1

. 2. Bazı işleyici komut için her şeyi geçmek ve detayları hakkında endişe edelim:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) handler.php?content=$1

Açıkçası bu "hava kod" Tüm denenmemiş ama noktası olsun.

  • Diğerinden daha ciddi daha yavaş olacak bu iki yoldan biri mi? Bunun için. Htaccess dosyaları kullanmak zorunda olacak beri Muhtemelen mod_rewrite, yavaştır.
  • Bu yaklaşımlardan birini ciddi dezavantajları var mı?
  • Bir "en iyi uygulama" bu tür bir şey için var mı, yoksa her geliştirici kendileri için karar eğilimi bir şeydir? (Ben tam olarak nasıl yaptıklarını araştırdık zaman değdi daha fazla sorun oldu gerçi) WordPress seçeneği iki kullanır biliyorum.

5 Cevap

Seçenek 1 (.htaccess and several .php files) sık sık "geçmişte" kullanılan; Şimdi, ben seçenek 2 (every request going through one .php file) daha çok kullanılan görmek.

Ben 2 seçeneği ile görmek başlıca avantajları şunlardır:

  • you can add / modify any kind of URL without having to change any physical file like .htaccess
    • hangi URL'lerin biçimi, örneğin, uygulamanızın admin bölümünde yapılandırılabilir anlamına gelir
  • you only have one entry point to your PHP code.
    • her şeyin olsa gider index.php anlamı: tüm istekleri için idam bazı kod gerekiyorsa, oraya koymak, ve her zaman idam olacak emin olabilirsiniz.
    • Yani, örneğin, MVC çerçeveler ile bir çok kullanılır.


A couple of years ago, I would have gone with option 1 ; now that I use MVC and Frameworks, I always go with option 2.

Gerçekten bu "çerçeveler kullanarak değer olan nedir?" kılık değiştirmiş bir soru.

URL yolları tanımlamak için mod_rewrite kullanarak hızlı ve kolay (düzenli ifadeler anlamak ...) ama bir yerde bilgi yinelenen sürece uygulama kodu URL'ler habersizdir.

Genellikle insanlar kendi görüşlerinde bağlantıları sabit kodlama URL'ler, düşünmeden bu bilgileri birçok kez yinelenen veya yönlendirmeler içinde. Yarım geliştirme yoluyla sitenizin URL yapısını değiştirmeye karar verdiğinizde bu gerçekten dağınık, ve bir gün anlayacaksın neden acı. Eğer bir bayan ve bir yerde 404 ile sona uğrarsınız.

: Eğer bir kez URL'leri tanımlamak ve onları birçok kez yeniden kullanmak için izin yolları isimlerini ekleyebilirsiniz demektir (örneğin Symfony içinde biri olarak) uygulamanızda bir yönlendirme bileşeni kullanılarak

# apps/frontend/config/routing.yml
homepage:
  url:   /
  param: { module: default, action: index }

Bu kendini tekrar olmadan sitenizin sayfalarına bağlantı gerçekten kolaylaştırır:

<?php echo url_for('@homepage') ?>

Seçenek # 2 kullanın - neden? .htaccess içinde RewriteRules güçlü bir araçtır, ama onlar static bazı naziksiniz. Ben kolayca PHP (veya ne olursa olsun kullanmak için gidiyoruz) sonra kullanarak yönetmek anlamına. Ayrıca .htaccess çok esneklik sağlar, ancak bazı avantajlara sahip değil (örneğin: biraz daha hızlı).

Seçenek # 2 de .htaccess fark olarak gereken, ancak çoğu durumda RewriteRule aşağıdaki formu alır:

RewriteRule (.\*) index.php

index.php ön denetleyicisi olduğu.

Bu soultion en büyük avantajı (IMO) her bir güzergah PHP (veya her ne kullanıyorsanız) tarif olmasıdır, böylece bu yolları erişen onları değiştirerek çok daha kolaydır. Ayrıca bu rotalar değişkenler dizi içine URL'sini değiştirmek için değil, aynı zamanda tam tersi bir şekilde değil, ancak o zaman kullanılabilir - değişkenler kümesi URL'sini oluşturmak için.

Ben (Symfony framework) Aşağıdaki örnekte ben neden bahsettiğimi anlatacağım düşünüyorum:

// apps/.../config/routing.yml - Describes routing rules
post:
   url:          /read/:id/:slug
   params:       { module: blog, action: index }
   requirements: { id: \d+, slug: \w+ }

// apps/.../modules/blog/templates/indexSuccess.php - template for index action
<?php echo link_to($post['title'], '@post?id=' . $post['id'] . '&slug=' . $post['slug']); ?>
//creates: <a href="/read/123/my-first-blog-post.html">My first blog post</a>

Şimdi rounting.yml dosyası ve değişim /read/:id/:slug içine değiştirmek her /:slug_:id uygulama tüm bağlantıları /my-first-blog-post_123.html dönüşecektir.

Eğer seçenek # 2 kullandığınızda bu tür ve diğer şeyler yapmak çok daha kolaydır.

Bildiğim kadarıyla ben gördüğünüz gibi, bu yöntemleri arasındaki olası performans farkı sadece gerçekten, gerçekten yüksek trafikli siteler için really ufacık ve alakalı.

Ben gibi, her iki yöntem de aynı derecede sık kullanılan "en iyi uygulama" olduğunu düşünüyorum. Proje yapısı buna izin veriyor, ve (projenin geri kalanı) PHP URL ayrıştırma ile evde daha iseniz, bir denetleyici dosyası aracılığıyla her şeyi koymak ve uygulama gerisini halledeyim.

Performansı gerçekten özü ise, ben arasında hiçbir yorumlanmış bir dil olduğundan, Apache adreslerini ele sahip, daha hızlı olduğunu sanıyorum. (Gerçi bu hiçbir sabit veri var). Ama dediğim gibi, muhtemelen uzun vadede sizin için en sürdürülebilir olacak hangisi seçmenin en iyisin.

Güzel URL'ler bir combination. Htaccess içinde modrewrite kurallar ve plug-in gibi yolu ve OtoYol gibi PHP Drupal modülleri kullanarak PHP-script tabanlı popüler içerik yönetim sistemi Drupal tarafından sağlanacak görünür temizliyorum.

Başarı ve popülerlik bu aracın Verilen - ve barındırma paylaşılan en mütevazı çalıştırmak kabiliyeti, ben bu cevap olacağını düşünüyorum.