mod_rewrite – .htaccess ile Bakım Sayfasına Yönlendirme
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYWihaRR' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Bir web sitesini ya da uygulamasında bakımla ilgili bir çalışma yapılması gerektiğinde ziyaretçileri durumu bildirir bir bakım sayfasına yönlendirmek icap ediyor. Bu gibi bir işlem için izlenebilecek bir çok yöntem var. Bunlardan bence en pratik ve kullanışlı olanı ise apache'nin mod_rewrite modülünü kullanarak koşula bağlı yönlendirme yapmaktır.
Zira, bakım sayfanıza belli IP'lerden gelen istekleri ya da bakıma alınacak web uygulamasına (örneğin bir reklam sunucusuna) sürekli olarak erişmesi gereken sitelerden gelen istekleri yönlendirmeden muaf tutmanız gerekebilir. Ayrıca bakım işleminin bir iki saatten uzun süreceği durumlarda, isteklere yönlendirmenin geçici olduğunu bildiren 302 status kodunu döndürmek de isteyebilirsiniz.
İşte bu gibi ihtiyaçlar için mod_rewrite kullanmak iyi bir yoldur.
Eğer ilginizi çekiyorsa yazının devamında yönlendirme işlemlerinin nasıl yapılabileceği ile ilgili açıklama ve örnekler bulabilirsiniz.
İçerik İndexi
Gereksinimler
.htaccess kullanarak yönlendirme yapabilmek için sisteminizde rewrite modülü bulunmalı ve apache .htaccess kullanabilmek üzere yapılandırılmış olmalıdır.
Normalde, gereksinimler konusunun üzerinde fazla durmadan direk yönlendirme işlemlerinin nasıl yapıldığına geçebilirim. Ancak konuya hakim olmayan kişilerin olabileceğini düşünerek gereksinimler konusunda da biraz detay vermek istiyorum.
Eğer siz mod_rewrite ve apache yapılandırması ile ilgili konulara zaten hakimseniz ve sadece yönlendirme işlemi ile ilgili doğru syntax'ları hatırlamak için gezerken yolunuz buraya düştüyse, şimdiki bölümü atlayarak “Yönlendirme İşlemleri” isimli ana başlığa geçebilirsiniz.
Mod_Rewrite
Mod_rewrite modülü hemen tüm *nix sistemlerde apache ile birlikte default olarak gelmektedir. Ancak sisteminizde olup olmadığından emin olmak için aşağıdaki şekilde yüklü modülleri listeleyerek kontrol edebilirsiniz.
# apachectl -M
Not: debian/ubuntu üzerinde apache2.x kullanıyorsanız komut “apache2ctl -M” olmalıdır.
...
actions_module (shared)
speling_module (shared)
userdir_module (shared)
alias_module (shared)
rewrite_module (shared)
proxy_module (shared)
proxy_balancer_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_connect_module (shared)
...
Kendi sisteminizde yukarıdaki listede de görüldüğü şekilde “rewrite_module” ibaresini görmeniz gerekir. Eğer bu modül kurulu değilse -ki dediğim gibi default kurulumlarda gelmektedir- sisteminizin paket yöneticisini kullanarak kurabilirsiniz.
Debian/Ubuntu Spesifik
Debian ya da Ubuntu üzeriden apache 2.x kullanıyorsanız, mod_rewrite default olarak yüklü gelecek olmasına rağmen muhtemelen devrede olmayacaktır. Bu durumu kontrol etmek için /etc/apache2/mods-enabled/ dizinininde rewrite.load isimli bir link dosyası olup olmadığına bakabilirsiniz:
# ls -l /etc/apache2/mods-enabled/ |grep rewrite
Modül devrede ise ilgili link dosyası aşağıdaki şekilde görüntülenmelidir.
lrwxrwxrwx 1 root root 30 2010-12-16 17:06 rewrite.load -> ../mods-available/rewrite.load
Eğer, listeleme işlemi boş sonuç döndürüyorsa modül devrede değil demektir.
Bu durumda aşağıdaki komutları kullanarak devreye almanız gerekecektir:
# a2enmod rewrite # /etc/init.d/apache2 restart
Bu şekilde rewrite modülü etkinleştirilmiş olacaktır.
AllowOverride Direktifi
Bildiğiniz gibi .htaccess, dizin bazlı yapılandırmalara izin dosyasıdır. .htaccess ile apache'yi her bir web sitesi için spesifik olarak yapılandırmak mümkün olmaktadır.
.htaccess dosyalarının kullanılabilmesi için Apache'nin buna göre yapılandırılmış olması gerekir. Bir sitenin kök dizininde (ya da alt dizinlerinde) bulunabilecek .htaccess dosyalarındaki yapılandırma ayarlarının okunup, devreye alınabilmesi için, Apache ana yapılandırma dosyasında (httpd.conf) ilgili web sitesine (ya da DocumentRoot'un kendisine) ait ‹Directory› etiketi altında tanımlanan AllowOverride direktifinin “None” yerine All (ya da en azından Fileinfo) olarak set edilmiş olması gerekir.
Genelde sunucunun kök dizini için bu direktif performans kaygıları nedeni ile default olarak “None” şeklinde set edilir. (Nitekim bu ayar'ı All yaptığınız zaman apache, gelen her bir istek için ilgili sitenin kök dizini ve tüm alt dizinlerde özel bir yapılandırma olup olmadığını saptamak için .htaccess dosyasını arar. Bu da sunucuya esktradan iş yüklemek demektir.)
Örnek olarak klasik bir httpd.conf default web dizini olan /var/www/html dizini için Directory etiketi ile tanımlanan yapılandırma şu şekildedir. (Çıktıda açıklama satırlarına yer verilmemektedir.)
‹Directory "/var/www/html"›
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
‹/Directory›
Yukarıdaki AllowOverride None ifadesi, /var/www/html dizini ve tüm alt dizinleri için .htaccess dosyalarının gözardı edilmesini söylemektedir.
Sizin yapılandırmanıza göre bu bölüm “AllowOverride All” ya da “AllowOverride FileInfo” şeklinde set edilmişse sorun yok. .htaccess dosyasına yazacağınız herşey dikkate alınacaktır. Bu nedenle bu bölümü atlayabilir, “Yönlendirme İşlemleri” isimli ana başlığa geçebilirsiniz.
Ancak yapılandırma dosyanızda “AllowOverride” direktifi “None” olarak görünüyorsa. All ya da FileInfo durumuna getirmeniz gerekir.
Elbette, AllowOverride direktifinin sunucunun tüm kök dizini için All olarak set edilmesi kaynak sıkıntısından dolayı performans kaygısı bulunan sistemler için olumlu bir hareket olmayabilir. Çünkü bu durum, biraz öncede dediğim gibi apache'nin kök dizininde alt dizinleri de içerecek şekilde her işlem için .htaccess dosyası aramasına neden olmaktadır.
Elbette sunucunuzda kaynak sıkıntınız yoksa ya da çok fazla site barındırmıyorsanız (dolayısı ile sunucunun kök dizini çok kalabalık değilse) yukarıda görülen genel kök dizinde AllowOverride direktifini All (ya da en azından FileInfo durumuna) getirebilirsiniz.
Ancak performans kaygınız var ise, yukarıdaki genel kök dizini için bu değeri olduğu gibi “None” olarak bırakabilir ve yönlendirme işlemini yapacağınız web sitenizin kök dizini için özel bir ‹Directory› etiketi açarak sadece o siteye ait kök dizin için “AllowOverride All” tanımlaması yapabilirsiniz.
Ben genel olarak bu yolu tercih etmekteyim.
Bu işlem için ana yapılandırma dosyanıza yukarıda da bir örneği verilmiş olan ‹Directory› etiketinin ‹/Directory›şeklindeki bitiminden hemen sonra kendi eklemenizi yapabilirsiniz.
Örnek olarak web sitemize ait kök dizin /var/www/html/websitem ise yapılandırma şu şekilde olabilir:
CentOS Sistemlerde Yapılandırma
CentOS sistemlerde ana yapılandırma dosyası olan /etc/httpd/conf/httpd.conf ‘u editleyin.
# vi /etc/httpd/conf/httpd.conf
Sunucunun ana kök dizininin belirlendigi (ve yukarıda çıktısı verilen) alanı bulun ve ilgili tanımlamanın bittiği yerden sonrasına (aslında sonrası olması çok da şart değil) aşağıda görüldüğü gibi kendi yapılandırmanızı ekleyin.
‹Directory "/var/www/html/websitem"›
AllowOverride All
‹/Directory›
Bu şekilde, sunucunun tüm kök dizini yerine sadece /var/www/html/websitem isimli dizinde .htaccess taraması yapılacaktır.
Debian Sistemlerde Yapılandırma
Debian'larda, öntnanımlı kök dizin /var/www'dir ve directory yapılandırmaları /etc/apache2/sites-enabled/000-default dosyasında yapılır
Bu dosyayı editleyin:
# vi /etc/apache2/sites-enabled/000-default
ve ana dizin için girilen (bir örneği yukarıda da verilmiş olan) tanımlamalardan hemen sonrasına, örnek olarak /var/www/websitem isimli dizinde barındırılan web sitesi şu şekilde bir ekleme yapın.
‹Directory "/var/www/websitem"›
AllowOverride All
‹/Directory›
Böylece, /var/www/websitem dizini altındaki .htaccess dosyaları dikkate alınacaktır.
FreeBSD Sistemlerde Yapılandırma
FreeBSD sistemlerde, ana yapılandırma dosyası /usr/local/etc/apache22/httpd.conf ve öntanımlı kök dizin /usr/local/www/apache22/data isimli dizindir.
Öncelikle httpd.conf dosyanızı editleyin:
# vi /usr/local/etc/apache22/httpd.conf
Kök dizin için girilmiş olan default Directory tanımlamasından hemen sonrasına, örnek olarak /usr/local/www/apache22/data/websitem dizini altında barındırılan web sitesi için aşağıdaki tanımlamyı ekleyin.
‹Directory "/var/www/websitem"›
AllowOverride All
‹/Directory›
Bu şekilde websitem dizini altında .htaccess dosyası kullanılabilecektir.
AllowOverride direktifi ile ilgili gereksinimleri de yerine getirdikten (ya da öyle olduklarına emin olduktan sonra) yazının ana konusu olan yönlendirme işlemlerinin nasıl yapılabileceğine ilişkin bölüme geçebiliriz.
Yönlendirme İşlemleri
Yönlendirme ile ilgil her tanımlama, işlemin yapılacağı web sitesinin kök dizininde bulunan (olmaması durumunda oluşturulması gereken) .htaccess isimli dosya içerisine yazılmaktadır ve yapılan değişiklikler herhangi bir servis restart'i gerektirmeksizin anında devreye girmektedir.
Yazının girişinde de bahsettiğim gibi yönlendirme işlemleri koşula bağlı olarak yapılabilmektedir. Şimdi en basit yönlendirme şeklinden başlayarak bir kaç farklı koşula göre örnekler yapalım.
Basit Yönlendirme
www.deneme.com isimli sitenizi görüntülemek isteyen herkesi istisnasiz olarak www.deneme.com altında oluşturduğunuz bakim.html sayfasına yönlendirmek için .htaccess dosyanıza aşağıdaki satırların eklenmesi yeterlidir:
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !/bakim\.html$ RewriteRule .* /bakim.html [R=302,L]
Bu rewrite kuralı, www.deneme.com'a gelen tüm istekleri www.deneme.com/bakim.html sayfasına yönlendirmekte ve açıklama olarak http status code 302 (geçici yönlendirme olduğunu bildiren bir) response verilmektedir.
Bu şekilde www.deneme.com adresindeki herhangi bir URL'ye gelen istek için aşağıdakine benzer bir header ile yönlendirme bilgisi verilecektir.
HTTP/1.1 302 Found Date: Thu, 16 Dec 2010 23:10:22 GMT Server: Apache/2.2.3 (CentOS) Location: http://www.deneme.com/bakim.html Content-Length: 291 Connection: close Content-Type: text/html; charset=iso-8859-1 ‹!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"› ‹html›‹head› ‹title›302 Found‹/title› ‹/head›‹body› ‹h1›Found‹/h1› ‹p›The document has moved ‹a href="http://www.deneme.com/bakim.html"›here‹/a›.‹/p› ‹hr› ‹address›Apache/2.2.3 (CentOS) Server at www.deneme.com Port 80‹/address› ‹/body›‹/html›
Görüldüğü gibi istekte bulunan kişiye, sayfanın www.deneme.com/bakim.html sayfasına yönlendirilmiş olduğu söyleniyor.
Belli IP`leri Hariç tutmak
Elbette, normal ziyaretçileri bakım sayfasına yönlendirirken, kendimizin ya da misal yazılım takımının kuracağı bağlantıları yönlendirmeden muaf tutmak isteyeceğiz.
Bunun nedenle örneğin 192.168.12.25 ip adresinden kurulan bağlantıları yönlendirmemek için yukarıdaki tanımlamayı şu şekilde revize edebiliriz.
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_HOST} !^192\.168\.12\.25
RewriteCond %{REQUEST_URI} !/bakim\.html$
RewriteRule .* /bakim.html [R=302,L]
Ya da tüm 192.168.12.0/24 networkünü yönlendirmeden muaf tutmak için yukarıdaki kırmızı satırı şu şekilde değiştirebiliriz:
RewriteCond %{REMOTE_HOST} !^192\.168\.12
Böylece, 192.168.12.1 – 254 aralığı yönlendirilmeyecektir.
Birden fazla ip adresinin ya da ip networkünün muaf tutulması için hepsini benzer formatta alt alta yazmak da mümkündür.
Belli REFERER'leri Hariç Tutmak
Sitenize link vermiş herhangi başka bir siteden (ya da sitelerden) gelen isteklerin yönlendirmeden hariç tutulması için kural şu şekilde düzenlenebilir:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_REFERER} !syslogs.org
RewriteCond %{REQUEST_URI} !/bakim\.html$
RewriteRule .* /bakim.html [R=302,L]
Bu şekilde, syslogs.org adresinde bulunan ve sitenizi işaret eden herhangi bir linke tıklayan kullanıcıların yönlendirmeden muaf tutulmasını sağlayabilirsiniz.
Bu gibi bir uygulama özellikle reklam sunucularının maintenance işlemleri sırasında çok işe yarayabilir. Zira, genelde reklam sunucularına bir çok siteden link bulunur. Reklam sunucusu bakıma alınacağı zaman öncesinde tüm sitelerden reklam sunucusuna giden banner vs. linklerini kaldırmak yerine ilgili sitelerden gelen isteklerin 1×1 pixel'lik saydam bir imaj dosyasına yönlendirilmesi daha pratik bir işlem olabilir. Böylece ilgili istekler için time out ya da 40x kodlu herhangi bir hata mesajı döndürülmemiş olur.
Bakım Sayfası İmaj Dosyalarına İzin
Bakım sayfanızda herhangi bir imaj görüntülüyor olabilirsiniz. Ancak yönlendirmeyi devreye aldığınız zaman, gelen her istek bakim.html dosyasına yönlendirileceği için bakım.html dosyası içerisinden çağırdığınız imaj dosyası da doğal olarak bakım dosyasının kendisine yönlendirilecektir.
Bu durumda ya resim dosya tiplerini ya da imaj dosyalarının bulunduğu dizinden bir istekte bulunan bağlantıları yönlendirmeden hariç tutmanız gerekir. Ben genel olarak ikinci yolu tercih ediyorum. Örnek olarak imaj'ların sitenin kök dizininde bulunan images isimli klasorde durduğunu düşünürsek, hariç tutma işlemi için kural satırları şu şekilde olmalıdır.
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/images/.*$
RewriteCond %{REQUEST_URI} !/bakim\.html$
RewriteRule .* /bakim.html [R=302,L]
Böylece, bakım sayfasında images/ dizininden çağırdığınız resim dosyaları da görüntülenecektir.
Bakım Sayfası CSS Dosyalarına İzin
Bu da gene yukarıdaki örneğe benziyor. Bakım sayfanızda herhangi bir css dosyasını çağırıyor olabilirsiniz. Sitenizin kök dizinindeki css isimli klasorde bulunan .css dosyalarını yönlendirmeden hariç tutmak için şu düzenleme yeterlidir.
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/css/.*$
RewriteCond %{REQUEST_URI} !/bakim\.html$
RewriteRule .* /bakim.html [R=302,L]
Hepsi Bir Arada
Son olarak yukarıda değindiğim tüm örnekleri içeren kural dizisi şu şekilde olacaktır.
RewriteEngine On RewriteBase / RewriteCond %{HTTP_REFERER} !syslogs.org RewriteCond %{REMOTE_HOST} !^192\.168\.12\.25 RewriteCond %{REMOTE_HOST} !^192\.168\.12\.26 RewriteCond %{REMOTE_HOST} !^10\.10\.1 RewriteCond %{REQUEST_URI} !^/images/.*$ RewriteCond %{REQUEST_URI} !^/css/.*$ RewriteCond %{REQUEST_URI} !/bakim\.html$ RewriteRule .* /bakim.html [R=302,L]
Böylece ilgili kuralları kendi ihtiyaçlarınıza göre düzenleyip devreye alabilirsiniz.
Daha fazla bilgi için şu adreslere de göz atabilirsiniz:
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
http://httpd.apache.org/docs/2.2/mod/core.html#allowoverride
http://httpd.apache.org/docs/2.2/howto/htaccess.html
Bu yazılar da ilginizi çekebilir:
- htaccess combiner ile Apache Performance Tunning
- Apache Mod_Status Yapilandirmasi
- Ossec Merkezi Agent Yapılandırması
- Linux Sistemlerde Gereksiz Servislerin Tespiti ve Kapatılması
- NCSA_AUTH ile Şifreli Squid Proxy Kurulumu | FreeBSD
Yorumlar
Trackbacks
Yorumda bulunun.
Hocam merhabalar,
yazınız oldukça açıklayıcı fakat bir sorum var, diyelim windows vps sahibiyiz ve müşterilerimizden birinin php sitesi var ve .htacces dosyası ile yönlendirme yapmak istiyor. Saçma olabilir ama bunu çalıştırmanın bir yolu var mıdır? Yoksa linux sunucuda bir alan mı almam daha mantıklı olur? Teşekkürler.
[Cevapla]
Selamlar,
Sanirim Windows uzerinde apache kullaniyorsunuz. Ben birebir denemedim ama Windows üzerinde calisan bir Apache sunucusunda da .htaccess kullanmak mümkün olmali.
[Cevapla]
Tam arşivlik bir yazı olmuş. Eline sağlık hocam.
[Cevapla]
Hocam Çok güzel anlatmışssınız çok güzel bir yazı olmuş Ellerinize sağlık ^_^
[Cevapla]
Çok açık anlatmışsınız, açıklamalarınızla sitemde bir yönlendirme yaptım çok da güzel çalıştı.. ancak admin panelini yönlendirme dışı tutamadım.. Aşağıdaki kod çalışmıyor, admin klasorunu ve tum icindeki alt dosyalari haric birakmiyor.. Yanlışlık nerede?
RewriteCond %{HTTP_REFERER} !http://www.site.com.tr/yonetim [NC]
[Cevapla]
Merhaba
.htaccess ile google index almış siteyi o şekilde giriş yapıyor
ama site adını tarayacıya yazınca siteyi bakim.html ye yönlendiriyor
yanlız google den siteye giriş yaptıktan sonra iç sayfalarda rahat dolaşabiliyoruz.
dışarıdan tarayıcıdan giriş yaptıgımda bir türlü siteye giriş yaptırmıyor
bunun aynını yapmak istiyorum nasıl yapabilirim yardımcı olurmusunuz
[Cevapla]