Ana Sayfa » *nix » mod_rewrite – .htaccess ile Bakım Sayfasına Yönlendirme

mod_rewrite – .htaccess ile Bakım Sayfasına Yönlendirme


BerbatKötüİdare EderGüzelHarika (Toplam 3 oy. 5 puan üzerinden ortalama 5,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYSjY3Nf' (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.

 

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 (.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 .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//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

Visited 3.700 times, 1 visit(s) today
Kategoriler: *nix,apache,ipucu |

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


  1. Mehmet ELMAS | (Ocak 24th, 2011 10:13 am)

    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]

    Cagri Ersen tarafından yanıtlandı.

    Selamlar,

    Sanirim Windows uzerinde apache kullaniyorsunuz. Ben birebir denemedim ama Windows üzerinde calisan bir Apache sunucusunda da .htaccess kullanmak mümkün olmali.

    [Cevapla]

  2. soulmy | (Ağustos 4th, 2013 2:56 am)

    Tam arşivlik bir yazı olmuş. Eline sağlık hocam.

    [Cevapla]

  3. Freelance PHP Coder | (Eylül 14th, 2014 1:43 am)

    Hocam Çok güzel anlatmışssınız çok güzel bir yazı olmuş Ellerinize sağlık ^_^

    [Cevapla]

  4. Can Emre Sintek | (Şubat 12th, 2015 4:14 pm)

    Ç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]

  5. Umut horoz | (Kasım 18th, 2015 1:46 pm)

    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]

Trackbacks

Yorumda bulunun.