.Htaccess ile nasıl uygun URL'ler oluşturabilirim?

Jun 13 2010

.Htaccess ile zor anlar yaşıyorum. Üzerinde çalıştığım bir site için uygun URL'ler oluşturmak istiyorum ...

Temel olarak bunu dönüştürmek istiyorum:

http://website.com/index.php?ctrl=pelicula&id=0221889
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters

Bunun içine:

http://website.com/pelicula/0221889/
http://website.com/pelicula/0221889/posters/

Daha sonra ihtiyacım olursa, makale başlığını şu şekilde URL'nin sonuna nasıl ekleyeceğimi de bilmek isterim (PHP kullanıyorum):

http://website.com/pelicula/0221889/the-article-name/
http://website.com/pelicula/0221889/the-article-name/posters/

Not: Stackoverflow yöntemi de benim için iyidir, örneğin bu sorunun url'si:

http://stackoverflow.com/questions/3033407/htacces-to-create-friendly-urls-help-needed

Ama kimliğin arkasına herhangi bir şey koyabilirsiniz ve o da çalışacaktır. böyle:

http://stackoverflow.com/questions/3033407/just-anything-i-want

.Htacces dosyasını oluşturmak için bazı otomatik web araçları kullandım, ancak düzgün çalışmıyor. Bu yüzden yardımını istiyorum.

.Htacces en iyi uygulamalarını ve önerilerini tavsiye edebilirseniz sevinirim ..

DÜZENLEME: Buraya aldığım bazı cevaplara dayanarak şunu koydum:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
</IfModule>

Ancak varsayılan ana bilgisayar 'sayfa bulunamadı' hatasını alıyorum.

Ben de denedim:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^/]+)/(\d+)/([^/]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
    RewriteRule ^([^/]+)/(\d+)/?$ index.php?ctrl=$1&id=$2 [QSA,L] RewriteRule ^([^/]+)/?$               index.php?ctrl=$1 [QSA,L]
</IfModule>

Bu da çalışmıyor. Beni varsayılan 404.php sayfama götürüyor.

mod_rewrite etkinleştirildi ve çalışıyor.

Yardım!

Yanıtlar

7 RichardJPLeGuen Jun 13 2010 at 18:49

Belge köküne http://website.com/şöyle bir htaccessdosya koyardım:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

Ardından, PHP betiğinizde $_GET['url']değişkeni istediğiniz gibi değiştirebilirsiniz :

$path_components = explode('/', $_GET['url']); $ctrl=$path_components[0]; $id=$path_components[1]; $tab=$path_components[2];
7 cam8001 Jun 18 2010 at 00:27

Bunu yerel olarak test ettik ve ihtiyacınız olan şeyi yapıyor gibi görünüyor:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^/.]+)(?:/)?$ /index.php?ctrl=$1 [L]
    RewriteRule ^([^/.]+)/([^/.]+)(?:/)?$ /index.php?ctrl=$1&id=$2 [L] RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)(?:/.*)?$ /index.php?ctrl=$1&id=$2&tab=$3 [L]
</IfModule>

Yaptığı şu:

  • Gibi bir yol için http://website.com/pelicula/, /index.php?ctrl=pelicula adresine yeniden yönlendirin
  • Gibi bir yol için http://website.com/pelicula/0221889, /index.php?ctrl=pelicula&id=0221889 adresine yeniden yönlendirin
  • Gibi bir yol için http://website.com/pelicula/0221889/posters/, /index.php?ctrl=pelicula&tab=posters adresine yeniden yönlendirin
  • Gibi bir yol için http://website.com/pelicula/0221889/posters/anything-can-go-here, /index.php?ctrl=pelicula&tab=posters'a yeniden yönlendirin ve yolun geri kalanını yok sayın.

Bu yeniden yazmalar, eğik çizgiyle veya eğik çizgisiz çalışacaktır - bunların yalnızca eğik çizgi olmadan çalışmasını istiyorsanız (?:/)?, ilk iki yeniden yazmanın sonundan kaldırın . Mod_rewrite'ı gerektiği gibi sondaki eğik çizgiyi eklemek veya kaldırmak için de kullanabilirsiniz.

Noname Jun 13 2010 at 18:46

.Htaccess dosyanızın kökte olduğunu varsayan ilki:

RewriteRule ^([a-zA-Z]+)/([0-9]+)(/)?$ index.php?ctrl=$1&id=$2

İkinci:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)(/)?$ index.php?ctrl=$1&id=$2&tab=$3

veya her zaman postersfarklı sekmelerden ziyade:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/posters(/)?$ index.php?ctrl=$1&id=$2&tab=posters

(/)?URI'nin eğik çizgi ile veya bitmeden çalışacağı anlamına gelen ifadesini ekledim .

Diğerine gelince, muhtemelen makaleyi her zaman sonunda saklarım, böylece yeniden yazılır veya başka bir tane ekler, /valueböylece yeniden yazma sekme ve makale arasındaki farkı bilir veya normal ifadeden kısa çizgiler çıkarır.

jfoucher Jun 13 2010 at 21:21

Bu url'ye sahip olmak için:

http://website.com/pelicula/0221889/posters

buna yeniden yazıldı:

http://website.com/index.php?ctrl=pelicula&id=0221889&tab=posters

Bunu yapardım:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
</IfModule>

Başlığı id'den sonra koymak isteyip istemediğinizi seçmeli ve bunu her zaman yapmalısınız, çünkü sekme değişkeni son konumda: 3 numara mı yoksa 4 numara mı olacağını bilmelisiniz. Eğer bunu yaparsanız :

RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)$ index.php?ctrl=$1&id=$2&tab=$4 [QSA,L]

üçüncü parantez yakalanmaz ve bu nedenle herhangi bir şey içerebilir.

umarım yardımcı olur

user371788 Jun 21 2010 at 02:07

Dizin ağacında sitenizin .htaccess ile çakışan başka bir .htaccess dosyası bulunmadığından emin olun.

KristofferSall-Storgaard Jun 21 2010 at 08:55

Benim bu kullanmak .htaccessdosyanın

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* rewrite.php [L]

Temel olarak, bir dosya veya dizin olarak mevcut değilse, rewrite.php kullanın ve bunun URL ayrıştırması vb. İle ilgilenmesine izin verin. Yeniden yazabileceğiniz en basit yol olduğuna inanıyorum.

Ayrıca, var_dump($_SERVER)en üstteki dizin olduğunu düşündüğünüz şeyin gerçekten en üst dizin olup olmadığını görmek için (çalıştığını bildiğiniz bir yer) sonuçlarına bakın, örneğin: /var/www/domain/www/index.phpyerine yazıyor olabilirsiniz ./var/www/domain/index.php

Fenton Jun 22 2010 at 07:26

Deneyime dayanarak, URI şemanızı yalnızca yeniden yazıldığını BİLDİĞİNİZ URI'lara uygulamayı kolaylaştıracak şekilde ayarlamanızı tavsiye ederim. Örneğin

Bunu dönüştürün:

http://website.com/index.php?ctrl=pelicula&id=0221889
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters

Bunun içine ("malzeme" kelimesini koydum, ancak bu gerçekten bulmanız muhtemel olanı, yani "alışveriş" veya "kütüphane" veya bu içerik ne ise onu tanımlayan bir şey olmalı):

http://website.com/stuff/pelicula/0221889/
http://website.com/stuff/pelicula/0221889/posters/

Bunu başarmak için, web sitenizin üst düzey klasörüne aşağıdaki kuralları içeren bir .htaccess dosyası koymanız gerekir:

RewriteEngine on
RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L,NC,QSA]
RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA]

Adresin "malzeme" kısmına sahip olduğunuzda (uygun bir adla yeniden adlandırılır), resimler, CSS içerikleri ve JavaScript içerikleri gibi diğer varlıkları yanlışlıkla yeniden yazmazsınız.

Bir yan not olarak, bahsettiniz:

Bu da çalışmıyor. Beni varsayılan 404.php sayfama götürüyor.

404 hata yeniden yönlendirmeniz nerede bildirilir?

อาจักเก็บตะวันเด็กเสเพล Nov 27 2017 at 21:37

RewriteRule ^ stuff /([🖤/.]+)/([🖤/.]+)/([🖤/.]+)/?$ index.php?ctrl=$1 & id =$2&tab=$3 [L, NC, QSA] RewriteRule ^ stuff /([🖤/.]+)/([🖤/.]+)/?$ index.php?ctrl=$1 & id = 2 ABD doları [L, NC, QSA]