Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 7 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Nginx, Apache'nin .htaccess dosyasını okumaz. Bu nedenle kuralları satır satır kopyalamak yerine, her kuralın amacını Nginx yapılandırmasındaki karşılığına çevirmek gerekir. En sık kullanılan eşleşmeler şunlardır: RewriteRule yerine location veya rewrite, RewriteCond yerine if ya da daha uygun bir location seçimi, RewriteRule ... [R=301] yerine return 301 kullanılır.

Temel fark: bağlam ve eşleşen yol​


Apache .htaccess kurallarını bulunduğu dizine göre değerlendirir. Belge kökündeki dosyada baştaki / çoğu RewriteRule deseninde kullanılmaz. Nginx ise kuralları genellikle server bloğunda ve URL yolunun başındaki / ile işler.

Apache'deki [L] bayrağı da doğrudan kopyalanmaz. Nginx'te return isteği hemen sonlandırır; rewrite ... last yeni bir location araması başlatır, rewrite ... break ise mevcut bağlamda devam eder. Bu seçim, kuralın başka bir location bloğuna yönlenip yönlenmeyeceğine göre yapılmalıdır.

Yaygın kuralların dönüşümü​


Aşağıdaki tablo, doğrudan sözdizimi çevirisi değil, aynı davranışı oluşturmak için kullanılacak yaklaşımı gösterir.
AmaçNginx karşılığıKarar
Kalıcı yönlendirmereturn 301Basit URL değişiminde tercih edilir
Tüm istekleri uygulamaya aktarmalocation / ve try_filesFront controller için uygundur
Dosya veya dizin yoksa yönlendirmetry_filesif (-f) yerine genellikle daha güvenlidir
Koşula bağlı rewritelocation, map veya sınırlı ifKoşulu önce sadeleştirin

Front controller örneği​


Örnek Apache kuralı:

Kod:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

Örnek, mevcut ve çalışan bir index.php giriş dosyası varsayar. Bu kural, gerçek bir dosya veya dizin olmayan istekleri index.php dosyasına aktarır. Nginx'te aynı amaç için server bloğuna şu yapı eklenebilir:

NGINX:
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php-fpm.sock;
    }
}

Uygulama adımları:
  1. Apache kuralının bulunduğu dizini ve gerçek belge kökünü belirleyin. /var/www/example.com/public yalnızca örnektir; kendi sunucunuzdaki doğru yolu kullanın.
  2. Nginx sunucu yapılandırmasında mevcut server bloğunu açın ve örnekteki location / bölümünü uygulamanızın giriş dosyasına göre düzenleyin.
  3. PHP-FPM soketinin veya TCP adresinin gerçekten mevcut olduğunu doğrulayın. fastcgi_pass satırını körlemesine kopyalamayın.
  4. Yapılandırmayı kontrol edin: nginx -t. Başarılı sonuçta sözdiziminin geçerli olduğunu belirten bir çıktı görmelisiniz.
  5. Nginx'i yeniden yükleyin: nginx -s reload. Ardından /olmayan-sayfa gibi bir yolu test edin; uygulamanızın 404 sayfası veya yönlendirilmiş yanıtı dönmelidir.

Yönlendirme örneği​


Apache:

Kod:
RewriteRule ^eski-sayfa/?$ /yeni-sayfa [R=302,L]

Nginx:

NGINX:
location = /eski-sayfa {
    return 302 /yeni-sayfa$is_args$args;
}

Geçici 302 örnekleri doğru sonuç doğrulandıktan sonra kalıcı politikaya geçirilebilir. Apache kuralı sonda eğik çizgiye izin veriyorsa Nginx'te iki ayrı kesin eşleşme veya uygun bir düzenli ifade kullanılmalıdır. Basit ve bilinen yollar için kesin location = kullanmak, beklenmedik eşleşmeleri azaltır. Nginx return hedefi sorguyu kendiliğinden eklemez. Korumak için aşağıdaki örnekte $is_args$args açıkça kullanılır; rewrite argüman davranışıyla karıştırmayın.

Koşulları çevirirken izlenecek sıra​

  1. Önce kuralın amacını yazın: yönlendirme mi, dahili rewrite mı, dosya yoksa uygulamaya aktarım mı?
  2. Kural sabit bir URL içinse location = ve return kullanın.
  3. Kural mevcut dosya ve dizinleri hariç tutuyorsa try_files ile çözmeyi deneyin.
  4. Host, yöntem veya başlık koşulu varsa önce ayrı bir location ya da map gerekip gerekmediğini değerlendirin. if bloklarını karmaşık erişim ve yönlendirme mantığı için gelişigüzel çoğaltmayın.
  5. Bir rewrite sonrası Nginx'in yeni location araması yapıp yapmayacağını last ve break seçimiyle belirleyin.

Sık yapılan hatalar​


Başta / bulunan Apache desenini Nginx'e aynen taşımak, yanlış location eşleşmesine yol açabilir. RewriteBase, RewriteMap ve Apache modüllerine özgü bayrakların Nginx'te bire bir karşılığı yoktur; bunlar amaçlarına göre yeniden tasarlanır. Ayrıca try_files içinde kullanılan dosya yolu ile root dizini uyuşmazsa uygulama her isteği 404 veya döngülü yönlendirme olarak görebilir.

Nginx yeniden yüklenmiyorsa önce nginx -t çıktısını okuyun. Yapılandırma geçerli olduğu hâlde sonuç yanlışsa eşleşme sırası, belge kökü, PHP-FPM hedefi ve uygulamanın gerçek giriş dosyası kontrol edilmelidir. Apache'deki kuralın tüm özel durumlarını bilmiyorsanız eski ve yeni sunucuyu aynı URL listesiyle karşılaştırmadan geçişi tamamlanmış saymayın.

Sık sorulan sorular​


.htaccess dosyasını Nginx sunucusunda bırakabilir miyim?​


Nginx dosyayı uygulamaz; ancak sıradan dosya olarak servis edilmediğini de doğrulayın. .htaccess, .htpasswd ve hassas yapılandırmaların web erişimini uygun location kurallarıyla kapatın. Dosyanın okunmaması, içeriğinin ziyaretçilerden kendiliğinden gizlendiği anlamına gelmez.

Apache'deki her RewriteCond için Nginx'te if kullanmalı mıyım?​


Hayır. Dosya ve dizin kontrollerinde çoğunlukla try_files, host veya değişken eşlemelerinde map, sabit yönlendirmelerde return daha uygun olur. if yalnız davranışı net ve sınırlı koşullarda kullanılmalıdır.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic