Apache mod_rewrite
Aradığınız şey mod_rewrite ,
Açıklama: İstenen URL'leri anında yeniden yazmak için kural tabanlı bir yeniden yazma motoru sağlar.
Genel olarak, mod_rewrite
istenen belgeyi belirtilen düzenli ifadelerle eşleştirerek çalışır, ardından dahili olarak (apache sürecinde) veya harici olarak (istemci tarayıcısında) URL yeniden yazma işlemleri gerçekleştirir. Bu yeniden yazma işlemleri, example.com/foo'yu dahili olarak example.com/foo/bar gibi bir isteğe çevirmek kadar basit olabilir.
Apache dokümanları bir mod_rewrite
rehber içerir ve yapmak istediğiniz bazı şeylerin içinde yer aldığını düşünüyorum. Ayrıntılı mod_rewrite kılavuzu .
Alt alanı www
zorla
Her url'den önce "www" ifadesini zorlamasını istiyorum, bu nedenle domain.com değil www.domain.com/page
Yeniden yazma kılavuzu, Canonical Hostname örneğinin altında bunun için talimatlar içerir .
Sondaki eğik çizgileri kaldırın (Bölüm 1)
Sondaki tüm eğik çizgileri sayfalardan kaldırmak istiyorum
Yeniden yazma kılavuzu tam tersi için bir örnek içerdiğinden , yani her zaman sonda bir bölü işareti içerdiğinden bunu neden yapmak isteyeceğinizden emin değilim . Dokümanlar, sondaki eğik çizgiyi kaldırmanın sorunlara neden olma açısından büyük bir potansiyele sahip olduğunu göstermektedir:
Sondaki Eğik Çizgi Sorunu
Açıklama:
Her web yöneticisi, dizinlere atıfta bulunan URL'lerin sonundaki eğik çizgi sorunu hakkında bir şarkı söyleyebilir. Eksiklerse, sunucu bir hatayı döker, çünkü /~quux/foo
bunun yerine söylerseniz /~quux/foo/
, sunucu foo adında bir dosya arar. Ve bu dosya bir dizin olduğu için şikayet ediyor. Aslında çoğu durumda kendi kendine düzeltmeye çalışır, ancak bazen bu mekanizmanın sizin tarafınızdan taklit edilmesi gerekir. Örneğin, CGI betiklerine vb. Birçok karmaşık URL yeniden yazdıktan sonra.
Belki de sondaki eğik çizgiyi neden her zaman kaldırmak istediğinizi açıklayabilirsiniz.
.php
Uzantıyı kaldır
.Php'yi kaldırmak için buna ihtiyacım var
Bunu yapmak için düşünebildiğim en yakın şey, .php uzantılı her istek belgesini dahili olarak yeniden yazmaktır, yani, example.com/somepage, bunun yerine example.com/somepage.php için bir istek olarak işlenir. Bu şekilde ilerlemenin, her bir sayfanın dosya sisteminde somepage.php olarak var olmasını gerektireceğini unutmayın.
Düzenli ifadelerin doğru kombinasyonu ile bu bir dereceye kadar mümkün olabilir. Bununla birlikte, dizin sayfalarının doğru şekilde istenmemesi ve dizinlerle doğru şekilde eşleşmemesiyle ilgili bazı olası sorunları öngörebilirim.
Örneğin, bu, example.com/test'i example.com/test.php için bir istek olarak doğru şekilde yeniden yazacaktır:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
Ancak example.com'un yüklenememesine neden olur çünkü example.com/.php yoktur
Sondaki tüm eğik çizgileri kaldırıyorsanız, ana dizindeki bir dosya adı isteğinden bir dizin dizini için bir istek seçmenin neredeyse imkansız hale geleceğini tahmin edeceğim. 'Foobar' dizini için bir talebi nasıl belirlersiniz:
example.com/foobar
foobar adlı bir dosya talebinden (aslında foobar.php olan)
example.com/foobar
RewriteBase
Direktifi kullanırsanız mümkün olabilir . Ancak bunu yaparsanız RewriteCond
, isteğin bir dizin veya dosya ile eşleşip eşleşmediğini dosya sistemi düzeyinde kontrol etmek için yönergelere ihtiyaç duyacağınız için bu sorun daha karmaşık hale gelir .
Bununla birlikte, sondaki tüm eğik çizgileri kaldırma gereksinimini kaldırırsanız ve bunun yerine sondaki eğik çizgileri eklemeye zorlarsanız "no .php uzantısı" sorunu biraz daha makul hale gelir.
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
Bu hala mükemmel değil - bir dosyaya yönelik her istekte hala isteğe dahili olarak .php eklenmiştir. 'Hi.txt' isteği bunu hata günlüklerinize koyacaktır:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
Ancak başka bir seçenek daha var, DefaultType
ve DirectoryIndex
yönergelerini şu şekilde ayarlayın:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
2013-11-14 Güncellemesi - Nicorellius'un gözlemini dahil etmek için yukarıdaki pasaj düzeltildi
Şimdi hi.txt (ve başka herhangi bir şey) için istekler başarılı, example.com/test'e yapılan istekler test.php'nin işlenmiş sürümünü döndürür ve index.php dosyaları yeniden çalışacaktır.
Bu çözüm için gerekli krediyi vermeliyim, bulduğum gibi Michael J. Radwins Blog Google'da php no extension apache'yi arayarak .
Sondaki eğik çizgileri kaldırın
Bazıları araması apache remove trailing slashes
beni bazı Arama Motoru Optimizasyonu sayfalarına getirdi. Görünüşe göre bazı İçerik Yönetim Sistemleri (bu durumda Drupal), URl'lerde eğik çizgi ile ve olmadan içeriği kullanıma sunacak ve bu da SEO dünyasında sitenizin yinelenen içerik cezasına maruz kalmasına neden olacaktır. Kaynak
mod_rewrite
İstenen kaynağın bir ile bitmesi koşuluyla /
yeniden yazmamız ve 301 Permanent Redirect
HTTP başlığını geri göndererek URL'yi yeniden yazmamız durumunda çözüm oldukça önemsiz görünüyor .
Alanınızın blamcast.net olduğunu varsayan ve isteğin isteğe bağlı olarak önek olarak alınmasına izin veren örneği burada www.
.
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Şimdi bir yere varıyoruz. Hepsini bir araya getirelim ve neye benzediğini görelim.
Zorunlu www.
, hayır .php
ve sondaki eğik çizgi yok
Bu, alan adının foobar.com olduğunu ve standart 80 numaralı bağlantı noktasında çalıştığını varsayar.
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
'R' bayrağı RewriteRule
yönerge bölümünde açıklanmıştır . Snippet:
redirect|R [=code]
(yönlendirmeye zorla) http://thishost[:thisport]/
Harici yeniden yönlendirmeyi zorlamak için (yeni URL'yi bir URI yapan ) Önek Değiştirme
. Kod belirtilmezse, 302 HTTP yanıtı ( GEÇİCİ OLARAK TAŞINMIŞ ) döndürülür.
Son Not
Eğik çizgi kaldırmanın başarılı bir şekilde çalışmasını sağlayamadım. Yeniden yönlendirme bana sonsuz yeniden yönlendirme döngüleri verdi. Orijinal çözümü daha yakından okuduktan sonra , yukarıdaki örneğin Drupal kurulumlarının nasıl yapılandırıldığından dolayı onlar için işe yaradığı izlenimini edindim. O özellikle şunlardan bahseder:
Temiz URL'lerin etkinleştirildiği normal bir Drupal sitesinde, bu iki adres temelde birbirinin yerine kullanılabilir
Eğik çizgiyle ve çizgisiz biten URL'lerle ilgili olarak. Ayrıca,
Drupal, .htaccess
web sunucunuza URL'leri nasıl işleyeceğini bildirmek için adlı bir dosya kullanır . Bu, Drupal'ın temiz URL büyüsünü sağlayan aynı dosyadır. .htaccess
Dosyanızın başına basit bir yeniden yönlendirme komutu ekleyerek
, sunucuyu sondaki eğik çizgileri otomatik olarak kaldırmaya zorlayabilirsiniz.