"Enter"a basıp içeriğe geçin

NGINX URL’leri Temizleme | Rewrites Rules

Last updated on 10 Eylül 2020

URL’leri düzenlemek oldukça yaygındır (ister görünüm ister güvenlik nedenleriyle). Bu yazımızda, dosya uzantısı bize gönderilmeden doğru sayfayı nasıl oluşturabileceğimize bir göz atalım. Bakmamız gereken kaynakları aşağıda paylaşıyorum

HTML Dosya Uzantısını Kaldırma

Sunucumuz için, URL’lerimizin dosyalarımızın sonunda .html içermesini istemiyoruz. Bunu kaldırmak için rewrite ve try_files yönergelerini kullanacağız.

Bunu iki adıma ayıracağız:

  1. rewrite kuralı kullanarak URL’leri dönüştüreceğiz. /Admin.html’ye gitmek /admin’e yönlendirmelidir.
  2. try_files kullanarak doğru sayfayı döndürdüğünden veya bir 404 döndürdüğümüzden emin olun.

Neler olacağını görmek için başka herhangi bir değişiklik yapmadan önce yeniden yazma kurallarımızı yazalım:

/etc/nginx/conf.d/default.conf

server {
    listen 80 default_server;
    listen 443 ssl;
    server_name _;
    root /usr/share/nginx/html;

ssl_certificate /etc/nginx/ssl/public.pem;
ssl_certificate_key /etc/nginx/ssl/private.key;

rewrite ^(/.*)\.html(\?.*)?$ $1$2 redirect;
rewrite ^/(.*)/$ /$1 redirect;

location = /admin.html {
    auth_basic "Login Required";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

error_page 404 /404.html;
error_page 500 501 502 503 504 /50x.html;

}

rewrite satırları şu kalıbı takip eder:

rewrite REGEX REPLACEMENT [flag];

İlk regex ifademizi inceleyelim: ^(/.*)\.html(\?.*)?$.

Başlangıç ^, URI’nin en başından gittiğimizi gösterir. Parantez kullanarak bir yakalama grubu oluşturuyoruz. /.* kalıbı, / ile başlamak ve bundan sonraki tüm karakterleri içermek anlamına gelir. Daha sonra, bir .html bulmayı umuyoruz (a kullanarak çıkmamız gerektiğine dikkat edin). Son olarak, URI’nin sonuna kadar ($ karakteriyle belirtildiği gibi) isteğe bağlı bir sorgu dizesi (a? Dan sonraki herhangi bir şey) alan başka bir yakalama grubu oluşturuyoruz. Yakalama grupları, 1 $, 2 $ vb. Kullanılarak yönün REPLACEMENT kısmında kullanılabilir olacaktır.

Servisi yeniden başlatalım.

[root] $ systemctl reload nginx

Sunucumuzu özel bir pencereden ziyaret edersek (hiçbir şeyin önbelleğe alınmasını istemeyiz), sonsuz bir yeniden yönlendirme döngüsüyle karşılaşırız. Bu, 404.html sayfasını bile yeniden yüklediğimiz için oluyor, böylece onu düzgün bir şekilde oluşturamayız bile. Bu yönlendirme döngüsünü düzeltmek için, try_files kullanmamız gerekecek.

/etc/nginx/conf.d/default.conf

server {
    listen 80 default_server;
    listen 443 ssl;
    server_name _;
    root /usr/share/nginx/html;
ssl_certificate /etc/nginx/ssl/public.pem;
ssl_certificate_key /etc/nginx/ssl/private.key;

rewrite ^(/.*)\.html(\?.*)?$ $1$2 redirect;
rewrite ^/(.*)/$ /$1 redirect;

location / {
    try_files $uri/index.html $uri.html $uri/ $uri =404;
}

location = /admin.html {
    auth_basic "Login Required";
    auth_basic_user_file /etc/nginx/.htpasswd;
    try_files $uri/index.html $uri.html $uri/ $uri =404;
}

error_page 404 /404.html;
error_page 500 501 502 503 504 /50x.html;
}

Her iki konum bloğumuza da biraz farklı kurallara sahip bir try_files yönergesi ekledik. Potansiyel olarak iç içe geçmiş dizinler içinde index.html’ye giden birini idare edebilmek istiyoruz. Try_files çağrısı, soldan sağa hareket eden istekle eşleşen ilk dosyayı (veya dizini) arayacaktır. Hiçbir şey bulunmazsa, en sağdaki dosya veya durum kodu döndürülür.

Sunucu yapılandırmasını yeniden yüklersek ve kök URL’ye veya durum sayfasına gitmeye çalışırsak, şimdi içeriği göreceğiz. Maalesef, artık HTTP temel kimlik doğrulamamıza ulaşmıyor gibi görünüyoruz. Bunun nedeni, konum bloklarını işlemeden önce $ uri’nin değişmesi ve /admin.html ile eşleşen bir $ uri’nin asla olmayacak olmasıdır.Bunun yerine bu konum kontrolünü / admin ile eşleşecek şekilde değiştirmemiz gerekiyor. İşte bu son yapılandırma dosyamız:

/etc/nginx/conf.d/default.conf

server {
    listen 80 default_server;
    listen 443 ssl;
    server_name _;
    root /usr/share/nginx/html;
ssl_certificate /etc/nginx/ssl/public.pem;
ssl_certificate_key /etc/nginx/ssl/private.key;

rewrite ^(/.*)\.html(\?.*)?$ $1$2 redirect;
rewrite ^/(.*)/$ /$1 redirect;

location / {
    try_files $uri/index.html $uri.html $uri/ $uri =404;
}

location = /admin {
    auth_basic "Login Required";
    auth_basic_user_file /etc/nginx/.htpasswd;
    try_files $uri/index.html $uri.html $uri/ $uri =404;
}

error_page 404 /404.html;
error_page 500 501 502 503 504 /50x.html;
}

Artık sayfayı yeniden yükleyip yeni bir özel tarayıcıdan erişmeye çalıştığımızda, şifremizi girmeniz istenecek.

Başka bir yazımızda görüşmek üzere,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.