Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
PHP Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > PHP > PHP örnek kodlar > php_ornek00004

PHP örnek kodlar

.htaccess dosyası kullanımı

.htaccess dosyası hakkında

.htaccess dosyası, Apache web sunucusu tarafından kullanılan bir yapılandırma dosyasıdır. Bu dosya, web sunucunuzun davranışını değiştirmek veya özelleştirmek için kullanılır. .htaccess dosyası, genellikle web sitesinin kök dizininde bulunur ve dosya adının başındaki nokta (.) ile başlar.

.htaccess dosyasının yanlış yapılandırılması web sitesinin çalışmasını etkileyebilir ve hatalara neden olabilir. Bu yüzden bu dosyayı düzenlerken dikkatli olmak önemlidir.

.htaccess dosyası ile yapılabilecek işlemler

.htaccess dosyası ile yapılabilecek işlemlerden bazıları aşağıda gösterilmektedir:

  • Arama motoru optimizasyonu (SEO)
  • Yönlendirme: Belirli URL'leri başka bir URL'ye yönlendirme.
  • Rewrite kuralları: URL yeniden yazma kurallarını tanımlama.
  • Hotlink koruma: Başka sitelerin içeriğinizi doğrudan bağlamasını engelleme.
  • Dosya gizleme
  • Hata sayfaları tanımlama: Özelleştirilmiş hata sayfalarını tanımlama.
  • IP erişim düzenleme: Belirli IP adreslerinden gelen istekleri engelleme veya izin verme.
  • Dizin erişim düzenleme: Belirli dizilere erişimi kısıtlama
  • Bot engelleme
  • SPAM engelleme
  • Cache kontrolü: Önbellekleme ayarlarını yapılandırma.

Dizin içerik listelemeyi engelleme

İçinde index.php veya index.html olmayan bir dizinin içeriğini listelemeyi engellemek için aşağıdaki komutu kullanabiliriz:


# Dizin içeriği listelemeyi engelleme
Options -Indexes

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php/$1 [L]

.htaccess dosyasını alt dizinlerde tanımladığınızda, tanımlı olduğu dizinin altındaki dizinler için aynı kurallar geçerlidir.

Arama motoru optimizasyonu (SEO)

Arama motorları tarafından yapılan aramaların daha verimli bir sonuç vermesi için, web tarayıcı satırından girilen tüm değerlerin ana dizinde index.php dosyasına yönlendirilerek, bir web sitesinin SEO uyumlu olması sağlanabilir.


# Web sitesinde dizin listelemeyi engelleme
Options -Indexes

# RewriteEngine'i açma işlemi
RewriteEngine On 

# Tarayıcıda belirtilen isme sahip dizin mevcut değilse, aşağıdaki RewriteRule satırına geçin.
​RewriteCond %{REQUEST_FILENAME} !-d
# Tarayıcıda belirtilen isme sahip dosya mevcut değilse, aşağıdaki RewriteRule satırına geçin.
RewriteCond %{REQUEST_FILENAME} !-f

# Gelen tüm istekleri ana dizinde bulunan index.php dosyasına yönlendirme
RewriteRule ^(.*)$ index.php/$1 [L]

301 yönlendirme

Kalıcı olarak gerçekleştirilen URL yönlendirmeleridir.

Web tarayısından yapılan girişlerin hepsini başlangıcında "www" bulunmayan site adresine yönlendirme


RewriteEngine On 

# Sadece site adı (mysite.com) ile giriş yapılmışsa
RewriteCond %{HTTP_HOST} ^mysite.com [NC, OR]
# www ile başlayarak (www.mysite.com)  giriş yapılmışsa
RewriteCond %{HTTP_HOST} ^www.mysite.com [NC]

# Yukarıda yapılan girişleri http://mysite.com/ adresine yönlendirme  
RewriteRule ^(.*)$ https://mysite.com/$1 [L, R=301, NC]

NC: Non case (Büyük küçük harf duyarsız)
OR: Veya
R: Yönlendirme (Redirect)
L: Bundan sonraki işlem satırlarını dikkate alma

Siteyi yeni bir siteye yönlendirme


RewriteEngine On 

# Siteyi yeni bir siteye yönlendirme
Redirect 301 https://mynewsite.com [NC, L]

Site içeriklerinin başka sitelerde kullanılmasını engellemek için hotlink yöntemi kullanabiliriz. Böylece, bant genişliğimizin diğer web siteleri tarafından kullanılmasını engelleyebiliriz.

Belirli uzantılara sahip dosyaların sitemizin adresi üzerinden paylaşılmasını engellemek için aşağıdaki satırları kullanabiliriz:​


RewriteEngine On 

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)? mysite.com/.*$ [NC]
RewriteRule \. (png|gif|jpg|jpeg|zip|mp3|mp4|xml|php|css|pdf)$ - [F]

IP engelleme

Belirli IP adreslerine izin vermek için Allow komutu, engellemek için Deny komutu kullanabiliriz.

Aşağıdaki satırlar, istek gönderen tüm adreslere izin verir. Sadece, 121.121.121.121 adresinden gelen isteği engeller.


Order Allow, Deny
Allow from all
Deny from 121.121.121.121

Aşağıdaki satırlar, istek gönderen tüm adresleri engeller. Sadece, 121.121.121.121 adresinden gelen isteğe izin verir.


Order Allow, Deny
Deny from all
Allow from 121.121.121.121

RewriteRule bayrakları (Flags)

Apache Server 2.4 sürümünde kullanılan ve buradan detaylı bilgilerine erişim sağlayabileceğiniz RewriteRule bayrakları (Flags) ile ilgili özet bilgiler aşağıdaki tabloda gösterilmektedir:

RewriteRule bayrakları (Flags)
Flag Açıklama Flag Açıklama
B RewriteRule'a dönüşümü uygulamadan önce alfasayısal olmayan karakterlerden kaçınması talimatını verir. N | next Kural kümesinin o ana kadarki sonucunu bir başlangıç noktası olarak kullanarak, kural kümesinin en baştan başlamasını sağlar. Döngüye neden olabileceği için çok dikkatli kullanılmalıdır.
BNP RewriteRule'a geri referanstaki boşluk karakterini '+' yerine %20'ye çıkarması talimatını verir. Sorgu dizesi yerine yol bileşeninde geri referans kullanılacaksa kullanışlıdır. NC | nocase RewriteRule'un büyük/küçük harfe duyarlı olmayan bir şekilde işlem yapmasını sağlar. Bu durumda, eşleşen URI'de harflerin büyük veya küçük harf olarak görünmesi arasında fark yoktur.
BCTLS [B] bayrağına benzer, ancak yalnızca kontrol karakterlerini ve boşluk karakterini, diakkate almaz. Bu, sorgu dizesine kodlanmamış olarak kopyalandıklarında reddedilen karakter kümesinin aynısıdır. NE | noescape Ön tanımlı olarak, & ve ? gibi özel karakterler, harici yönlendirmelerle sonuçlanan kurallar için onaltılık kod eşdeğerlerine dönüştürülür. [NE] bayrağı bu dönüştürmeyi önler.
BNE İçindeki karakterlerin listesi, [B] veya [BCTLS] bayraklarının karakterlerinin hariç tutulması olarak değerlendirilir. Listelenen karakterlerden dikkate alınmayacaktır. NS | nosubreq Kuralın alt isteklerde kullanılmasını engeller.
C | chain RewriteRule'un bir sonraki kurala bağlandığını gösterir. Yani kural eşleşirse her zamanki gibi işlenir ve kontrol bir sonraki kurala geçer. Ancak eşleşmiyorsa sonraki kural ve birbirine zincirlenen diğer kurallar devre dışı kalır. P | proxy İsteğin mod_proxy tarafından ve bir proxy isteği aracılığıyla işlenmesini sağlar.
CO | cookie Belirli bir RewriteRule eşleştiğinde bir çerez ayarlanmasına olanak tanır. PT | passthrough RewriteRule'daki hedefin (veya ikame dizesinin) varsayılan olarak bir dosya yolu olduğu kabul edilir. [PT] bayrağının kullanılması bunun yerine URI olarak değerlendirilmesini sağlar.​
DPI | discardpath Yeniden yazılan URI'nin PATH_INFO kısmının atılmasını sağlar. QSA | qsappend Değiştirme URI'si bir sorgu dizesi içerdiğinde, RewriteRule'un varsayılan davranışı mevcut sorgu dizesini atmak ve onu yeni oluşturulan sorgu dizesiyle değiştirmektir. [QSA] bayrağının kullanılması sorgu dizelerinin birleştirilmesini sağlar.​
E | env Bir ortam değişkeninin değerini ayarlayabilir.​ QSD | qsdiscard İstenen URI bir sorgu dizesi içerdiğinde ve hedef URI içermediğinde, RewriteRule'un varsayılan davranışı, bu sorgu dizesini hedef URI'ye kopyalamaktır. [QSD] bayrağının kullanılması sorgu dizesinin atılmasını sağlar.
END Mevcut yeniden yazma işlemini ([L] gibi) sonlandırır, aynı zamanda dizin bazında (htaccess) daha sonraki yeniden yazma işlemlerinin gerçekleşmesini de engeller. QSL | qslast Ön tanımlı olarak, değişiklikteki ilk (en soldaki) soru işareti, yolu sorgu dizesinden ayırır. [QSL] bayrağını kullanmak, RewriteRule'a bunun yerine son (en sağdaki) soru işaretini kullanarak iki bileşeni bölmesi talimatını verir.​
F | forbidden Sunucunun istemciye 403 Yasak durum kodunu döndürmesine neden olur. Aynı davranış Deny yönergesi kullanılarak da gerçekleştirilebilirken, bu durum Yasak durumu atamada daha fazla esneklik sağlar. R | redirect Karakter
G | gone Sunucuyu yanıtla birlikte "410 Gone status" döndürmeye zorlar. Bu, bir kaynağın önceden mevcut olduğunu ancak artık mevcut olmadığını gösterir. S | skip Çalıştırılmak istenmeyen kuralları atlamak için kullanılır. Atlama bayrağının sözdizimi [S=N] şeklindedir; burada N, atlanacak kural sayısını belirtir.
H | handler Ortaya çıkan isteği belirtilen işleyiciyle işlenmeye zorlar. T | type Ortaya çıkan yanıtın gönderileceği MIME türünü ayarlar. AddType yönergesiyle aynı etkiye sahiptir.
L | last [L] bayrağı mod_rewrite'ın kural kümesini işlemeyi durdurmasına neden olur. Kuralın devreye girmesi durumunda başka kuralın çalışmayacağı anlamına gelir. Geçerli kuralın, başka kurallar dikkate alınmadan hemen uygulanması gerektiğinde kullanılır.    

.htaccess dosyası karakter kodları

Karakter kodları
Karakter Açıklama
# Sunucu satıra herhangi bir işlem yapmaz. Yorum satırıdır.
[xyz] Köşeli parantez içindeki herhangi bir karakter eşleşecektir. Örneğin, "[xyz]" x, y veya z karakterlerinden herhangi biriyle eşleşecektir.
[xyz]+ Parantez içindeki öğelerin herhangi bir kombinasyonunun eşleşeceği karakter sınıfı. Örneğin, "[xyz]+" herhangi bir sayıda x, y, z veya bunların herhangi bir kombinasyonuyla eşleşecektir.
[^xyz] Bir karakter sınıfının içinde değil. Örneğin, [^xyz] x, y veya z dışındaki herhangi bir karakterle eşleşecektir.
[a-z] Bir karakter sınıfındaki iki karakter arasındaki kısa çizgi “-” karakter aralığını belirtir. Örneğin, [a-zA-Z] tüm küçük ve büyük harfleri içerir.
a{n} n sayısı kadar a sayısını gösterir. Örneğin x{3} tam olarak üç adet x değerine karşılık gelir.
a{n,} n sayısı veya daha fazlası kadar a sayısını gösterir. Örneğin x{3,} üç adet veya daha fazla x değerine karşılık gelir.
a{n,m} n ile m arasında bir sayı aralığını gösterir. Örneğin, x{3,7} üç, dört, beş, altı veya yedi x'e karşılık gelir.
() Karakterleri bir arada gruplamak, böylece onları tek bir birim olarak kabul etmek için kullanılır. Örneğin, (htaccess)?book, "htaccess" öneki olsun ya da olmasın, "book" değerine karşılık gelir.
^ Düzenli bir ifadenin başlangıcını belirtir. Örneğin, "^Merhaba" ifadesi "Merhaba" ile başlayan herhangi bir dizeyi gösterir. "^" düzeltme işareti olmasaydı, "Merhaba" dizenin herhangi bir yerinde eşleşirdi.
$ Düzenli ifadenin sonunu belirtir. Örneğin, "world$", "world" ile biten herhangi bir dizeye karşılık gelir. "$" değeri olmasaydı, "world" dizenin herhangi bir yerinde eşleşirdi.
? Önceki karakteri isteğe bağlı olarak bildirir. Örneğin, "kitaplar?" ifadesi, "kitap" veya "kitaplar" ile eşleşir. Başka bir deyişle, "x?" sıfır veya "x" ten biriyle eşleşir.
! Olumsuzluğu ifade eder. Örneğin "!dizi", "dizi" dışındaki her şeyle eşleşir.
. Gerçek bir nokta (veya nokta), herhangi bir rastgele karakteri belirtir.
- Apache'ye URL'yi yeniden YAZMAMASI talimatını verir. Örnek sözdizimi: "example.com - [F]"
+ Önceki karakterlerden bir veya daha fazlasıyla eşleşir. Örneğin, "G+" bir veya daha fazla G ile eşleşir, "+" ise herhangi türden bir veya daha fazla karakterle eşleşecektir.
* Önceki karakterin sıfır veya daha fazlasıyla eşleşir. Örneğin, hepsini ifade etmek için ".*" kullanabiliriz.
| Mantıksal bir "veya" işlemcisi bildirir. Örneğin "(x|y)", "x" veya "y" ile eşleşir.
\ ^ $ ! . * | ( ) [ ] { } gibi karakterlerden kaçış oluşturmak için.
\. Gerçek bir noktayı (kaçış) gösterir.
/* Sıfır veya daha fazla eğik çizgi.
.* Sıfır veya daha fazla rastgele karakter.
^$ Boş bir dize tanımlar.
^.*$ Her şeyi eşleştirmek için standart kalıp.
[^/.] Ne eğik çizgi ne de nokta olmayan bir karakteri tanımlar.
[^/.]+ Eğik çizgi veya nokta içermeyen herhangi bir sayıda karakteri tanımlar.
http:// Gerçek bir ifadedir. Bu durumda, gerçek karakter dizisi "http://".
^example.* "example" terimiyle başlayan ve ardından bir karakter/karakterler gelen bir dizeyle eşleşir.
^example\.com$ Tam olarak "example.com" dizesini tanımlar.
-d Dizenin mevcut bir dizin olup olmadığını test eder.
-f Dizenin mevcut bir dosya olup olmadığını test eder.
-s Test dizesindeki dosyanın sıfırdan farklı bir değere sahip olup olmadığını test eder.

Durum kod tanımlamaları

.htaccess dosyasında en sık kullanılan durum kodları aşağıdaki tabloda gösterilmektedir:

Durum kodları
Kod Değer Açıklama
301 Moved Permanently İstek gönderilen hedef kaynağa yeni bir kalıcı URI atandığını ve bu kaynağa gelecekte yapılacak tüm referansların döndürülen URI'lerden birini kullanması gerektiğini belirtir.
302 Found Hedef kaynağın geçici olarak farklı bir URI altında bulunduğunu gösterir.
400 Bad Request İstemci hatası olarak algılanan bir durum nedeniyle sunucunun isteği işleyemediğini veya işlemeyeceğini belirtir.
401 Unauthorized Hedef kaynak için geçerli kimlik doğrulama bilgilerinin bulunmaması nedeniyle isteğin uygulanmadığını gösterir.
403 Forbidden Sunucunun isteği anladığını ancak yerine getirmeyi reddettiğini gösterir.
404 Not Found Sunucunun, istek yapılan URI ile ilgili hiçbir şey bulamadığını gösterir.
410 Gone İstek yapılan kaynağın artık sunucuda mevcut olmadığını ve bu durumun muhtemelen kalıcı olacağını gösterir.
500 Internal Server Error Sunucunun, isteği yerine getirmesini engelleyen beklenmeyen bir durumla karşılaştığını gösterir.
501 Not Implemented Sunucunun isteği yerine getirmek için gereken işlevselliği desteklemediğini gösterir.
502 Bad Gateway Sunucunun ağ geçidi veya proxy görevi görürken, isteği yerine getirmeye çalışırken eriştiği bir gelen sunucudan geçersiz bir yanıt aldığını gösterir.
503 Service Unavailable Sunucunun geçici aşırı yükleme veya planlanmış bakım nedeniyle şu anda isteği yerine getiremediğini gösterir.
504 Gateway Timeout Sunucunun bir ağ geçidi veya proxy görevi görürken, isteği tamamlamak için erişmesi gereken bir yukarı akış sunucusundan zamanında yanıt alamadığını gösterir.

Kullanılan tüm durum kodları ile ilgili en güncel verilere buradan erişim sağlayabilirsiniz.