- Konu sahibi
- #1
Nginx, Apache'nin
Apache
Apache'deki
Aşağıdaki tablo, doğrudan sözdizimi çevirisi değil, aynı davranışı oluşturmak için kullanılacak yaklaşımı gösterir.
Örnek Apache kuralı:
Örnek, mevcut ve çalışan bir index.php giriş dosyası varsayar. Bu kural, gerçek bir dosya veya dizin olmayan istekleri
Uygulama adımları:
Apache:
Nginx:
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
Başta
Nginx yeniden yüklenmiyorsa önce
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.
Hayır. Dosya ve dizin kontrollerinde çoğunlukla
.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önlendirme | return 301 | Basit URL değişiminde tercih edilir |
| Tüm istekleri uygulamaya aktarma | location / ve try_files | Front controller için uygundur |
| Dosya veya dizin yoksa yönlendirme | try_files | if (-f) yerine genellikle daha güvenlidir |
| Koşula bağlı rewrite | location, map veya sınırlı if | Koş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ı:
- Apache kuralının bulunduğu dizini ve gerçek belge kökünü belirleyin.
/var/www/example.com/publicyalnızca örnektir; kendi sunucunuzdaki doğru yolu kullanın. - Nginx sunucu yapılandırmasında mevcut
serverbloğunu açın ve örnektekilocation /bölümünü uygulamanızın giriş dosyasına göre düzenleyin. - PHP-FPM soketinin veya TCP adresinin gerçekten mevcut olduğunu doğrulayın.
fastcgi_passsatırını körlemesine kopyalamayın. - Yapılandırmayı kontrol edin:
nginx -t. Başarılı sonuçta sözdiziminin geçerli olduğunu belirten bir çıktı görmelisiniz. - Nginx'i yeniden yükleyin:
nginx -s reload. Ardından/olmayan-sayfagibi 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
- Önce kuralın amacını yazın: yönlendirme mi, dahili rewrite mı, dosya yoksa uygulamaya aktarım mı?
- Kural sabit bir URL içinse
location =vereturnkullanın. - Kural mevcut dosya ve dizinleri hariç tutuyorsa
try_filesile çözmeyi deneyin. - Host, yöntem veya başlık koşulu varsa önce ayrı bir
locationya damapgerekip gerekmediğini değerlendirin.ifbloklarını karmaşık erişim ve yönlendirme mantığı için gelişigüzel çoğaltmayın. - Bir rewrite sonrası Nginx'in yeni
locationaraması yapıp yapmayacağınılastvebreakseç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.