Xóa dấu gạch chéo khỏi URL bằng nginx


14

Tôi muốn các URL sau trên trang web của tôi tương đương:

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

và hơn nữa tôi muốn hai biểu mẫu thứ hai phát hành chuyển hướng HTTP 301 sang biểu mẫu đầu tiên. Tôi chỉ phục vụ các trang tĩnh, và chúng được sắp xếp theo mẫu thứ ba. (Nói cách khác, khi người dùng yêu cầu /foo/barhọ sẽ nhận được tệp tại /usr/share/.../foo/bar/index.html).

nginx.confHiện tại của tôi có chứa những điều sau đây:

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

Điều này hoạt động cho các yêu cầu /foo/bar/index.html, nhưng khi tôi yêu cầu /foo/barhoặc /foo/bar/Safari nói với tôi rằng đã xảy ra quá nhiều chuyển hướng, thì siêu tốc giả định có một vòng lặp chuyển hướng vô hạn hoặc một cái gì đó tương tự. Làm cách nào tôi có thể lấy nginx để ánh xạ URL tới các tệp theo cách tôi đã mô tả?

Chỉnh sửa: Cấu hình đầy đủ của tôi

Đây là toàn bộ nginx.conftên miền của tôi được thay thế bằng Ví dụ.com.com.

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;
    }
  }
}

Những tập tin này thực sự tồn tại trên hệ thống tập tin?
Michael Hampton

@MichaelHampton Có. Yêu cầu /foo/bar/index.htmlphải trả lại tệp tại /usr/share/nginx/www/foo/bar/index.htmlhoặc tuy nhiên nó được thiết lập. Tất cả các đường dẫn trên trang web tương ứng trực tiếp với các đường dẫn hệ thống tập tin.
bdesham

@bdesham Tôi không thể sao chép. Đây là những gì tôi nhận được với cấu hình dán của bạn.ubfox.com/7501697
Alexey Ten

@AlexeyTen Thật kỳ lạ khi bạn nhận được một cái gì đó khác biệt. Cảm ơn vì đã điều tra việc này. Tôi đã đăng một cấu hình mà cuối cùng làm việc cho tôi.
bdesham

Câu trả lời:


19

Có regex này trên serverkhối của bạn :

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

sẽ chuyển hướng tất cả URL dấu gạch chéo sang dấu gạch chéo không tương ứng.


1
Địa chỉ này chỉ là một phần của câu hỏi.
bdesham

5
Điều này giải quyết tiêu đề đầy đủ của câu hỏi.
Jivan

5

Tôi đã có thể có được hành vi mong muốn của mình bằng cách sử dụng khối này làm serverkhối cuối cùng trong cấu hình của mình:

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;
  }
}

Điều này dường như không hoạt động đối với tôi - /index.htmlURL được trả lời bằng HTTP 200 thay vì chuyển hướng; các dòng "viết lại" bị bỏ qua. Đây có còn là hiện tại?
Christoph Burschka

1

Không bao giờ sử dụng viết lại:

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

Bạn có thể mở rộng lý do tại sao bạn không nghĩ viết lại là một ý tưởng tốt?
bdesham


Lý do các liên kết của bạn đề xuất tránh viết lại là vì mức độ dễ đọc, không phải vì chúng có thể gây ra tác dụng phụ ngoài ý muốn. Câu trả lời của bạn ít được đọc hơnrewrite ^(.+)/+$ $1 permanent;
chrBrd

1
Đây là một câu trả lời hay, tôi không biết tại sao nó lại bị đánh giá thấp. Bài viết có tiêu đề "Đánh thuế lại" giải thích tại sao rewritecó thể xấu. Điều đó đang được nói, câu trả lời được cung cấp cũng nắm bắt và khớp với URI, tôi không chắc liệu sẽ cải thiện hiệu suất hay không, nó cần thử nghiệm. Sử dụng regex này (?<no_slash>.+)/$thay thế để không chuyển hướng trang chủ.
Dao cạo

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

Quy tắc này sẽ xử lý bất kỳ số dấu gạch chéo nào và sẽ giữ lại URL. Nó cũng sẽ xử lý các dấu gạch chéo URL cơ sở

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.