.Htaccess ile nasıl uygun URL'ler oluşturabilirim?
.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
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];
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.
.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.
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
Dizin ağacında sitenizin .htaccess ile çakışan başka bir .htaccess dosyası bulunmadığından emin olun.
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
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?
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]