Nginx ile bir URL'den sonuna eğik çizgi kaldırma


15

Sitemdeki şu URL'lerin eşdeğer olmasını istiyorum:

/foo/bar
/foo/bar/
/foo/bar/index.html

ve ayrıca ikinci iki formun ilk forma HTTP 301 yönlendirmeleri yayınlamasını istiyorum. Sadece statik sayfalar sunuyorum ve bunlar üçüncü forma göre düzenleniyor. (Diğer bir deyişle, bir kullanıcı istediği /foo/barzaman dosyayı adresinden almalıdır /usr/share/.../foo/bar/index.html).

Benim nginx.confşu anda aşağıdakileri içerir:

rewrite ^(.+)/$ $1 permanent;
index index.html;
try_files $uri $uri/index.html =404;

Bu, istekler için çalışır /foo/bar/index.html, ancak istekte bulunduğumda /foo/barveya /foo/bar/Safari, “çok fazla yönlendirme gerçekleştiğini” söylediğinde - Sonsuz bir yönlendirme döngüsü veya bunun gibi bir şey olduğunu varsayıyorum. Nginx'i URL'leri dosyalara açıkladığım şekilde eşleştirmek için nasıl alabilirim?

Düzenleme: Tam yapılandırmam

İşte benim nginx.confalan adımla “example.com” ile değiştirilmiş olan bütünlüğüm.

user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
  worker_connections 768;
}

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  server_tokens off;

  server_names_hash_bucket_size 64;

  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss application/atom+xml text/javascript image/svg+xml;

  server {
    server_name www.example.com;
    listen 80;
    return 301 $scheme://example.com$request_uri;
  }

  server {
    server_name example.com 123.45.67.89 localhost;
    listen 80 default_server;

    # Redirect /foobar/ to /foobar
    rewrite ^(.+)/$ $1 permanent;

    root /usr/share/nginx/www/example.com;
    index index.html;
    try_files $uri $uri/index.html =404;

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

    location = /50x.html {
      root /usr/share/nginx/html;
    }
  }
}

Bu dosyalar gerçekte dosya sisteminde var mı?
Michael Hampton

@MichaelHampton Evet. Talepleri /foo/bar/index.htmlde dosyayı dönmelidir /usr/share/nginx/www/foo/bar/index.htmlveya bununla kurulduktan. Web sitesindeki tüm yollar doğrudan dosya sistemi yollarına karşılık gelir.
bdesham

@bdesham çoğaltamıyorum. Yapılandırmanızla ne alacağım paste.ubuntu.com/7501697
Alexey Ten

@AlexeyTen Farklı bir şeyler edinmeniz tuhaf. İçeriğe baktığın için teşekkürler. Sonunda benim için çalışan bir yapılandırma yayınladım.
bdesham

Yanıtlar:


19

Blokunuzda bu normal ifadeyi kullanmak server:

rewrite ^/(.*)/$ /$1 permanent;

tüm izleyen eğik çizgi URL'lerini ilgili izleyen eğik çizgiye yönlendirir.


1
Bu sorunun sadece bir kısmını ele almaktadır.
bdesham

5
Bu sorunun tam başlığı.
Jivan

5

İstediğim davranışı, serveryapılandırmamdaki son blok olarak kullanarak başardım :

server {
  server_name example.com 123.45.67.89 localhost;
  listen 80 default_server;

  # Redirect /foobar/ and /foobar/index.html to /foobar
  rewrite ^(.+)/+$ $1 permanent;
  rewrite ^(.+)/index.html$ $1 permanent;

  root /usr/share/nginx/www/example.com;
  index index.html;
  try_files $uri $uri/index.html =404;

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

  location = /50x.html {
    root /usr/share/nginx/html;
  }
}

Bu benim için işe yaramıyor - /index.htmlURL bir yönlendirme yerine HTTP 200 ile yanıtlanıyor; "yeniden yazma" satırları yoksayılır. Bu hala güncel mi?
Christoph Burschka

1

Asla yeniden yazma kullanmayın:

  location ~ (?<no_slash>.*)/$ {
       return 301 $scheme://$host$no_slash;
  }

1
Yeniden yazmanın neden iyi bir fikir olmadığını düşündüğünüzü genişletebilir misiniz?
bdesham


Bağlantılarınızın yeniden yazmalardan kaçınmayı önermesinin nedeni, istenmeyen yan etkilere neden olabileceği için değil, okunaklı okunabilirlik içindir. Cevabınız çok daha az okunabilirrewrite ^(.+)/+$ $1 permanent;
chrBrd

1
Bu iyi bir cevap, neden aşağı indirildiğini bilmiyorum. Makale , neden rewritekötü olabileceğini açıklayan bir "Vergi Yeniden Yazma" başlığına sahiptir . Olduğu söyleniyor, verilen cevap da URI'yi yakalar ve eşleştirir, performansı artıracak mı emin değilim, teste ihtiyacı var. (?<no_slash>.+)/$Ana sayfayı yeniden yönlendirmemek için bu normal ifadeyi kullanın.
Razor

0
if ($request_uri ~ (.*?\/)(\/+)$ ) {
return 301 $scheme://$host$1;
}

Bu kural, herhangi bir sayıda eğik çizgi ile ilgilenir ve URL'yi korur. Ayrıca, temel URL sondaki eğik çizgilerle de ilgilenir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.