Làm cách nào để xóa dấu gạch chéo kép trong URL được cung cấp bởi nginx?


9

Tôi cần sao chép các quy tắc viết lại Apache sau trong cấu hình Nginx trên Ubuntu 12.04. Nginx tương đương với:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]


Bất cứ ai tìm thấy điều này trực tuyến và cố gắng sao chép-dán các câu trả lời được đề xuất, hãy cẩn thận nếu bạn đang sử dụng thiết lập Virtualbox với các cổng tùy chỉnh. Tôi đã phải thay đổi nó thành ví dụ rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;, trong đó 4321 là cổng ngoài của Virtualbox'd nginx trình duyệt của tôi kết nối với.
aexl

Câu trả lời:


6

Tôi muốn đề xuất phương pháp này:

# remove multiple sequences of forward slashes
# rewrite URI has duplicate slashes already removed by Nginx (merge_slashes on), just need to rewrite back to current location
# note: the use of "^[^?]*?" avoids matches in querystring portion which would cause an infinite redirect loop
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}

Nó sử dụng hành vi mặc định của nginx - hợp nhất các dấu gạch chéo, vì vậy chúng tôi không cần thay thế dấu gạch chéo, chúng tôi chỉ cần chuyển hướng

tìm thấy ở đây



Điều này không hoạt động đối với SSL thông qua certbot nếu bạn có nginx làm proxy ngược thông qua proxy_pass
Jonathan

3

Tôi thấy phản ứng của kwo không hoạt động. Nhìn vào nhật ký gỡ lỗi của tôi, đây là những gì xảy ra:

2014/08/18 15:51:04 [debug] 16361#0: *1 http script regex: "(.*)//+(.*)"
2014/08/18 15:51:04 [notice] 16361#0: *1 "(.*)//+(.*)" does not match "/contact-us/", client: 59.167.230.186, server: *.domain.edu, request: "GET //////contact-us//// HTTP/1.1", host: 
"test.domain.edu"

Tôi thấy điều này làm việc cho tôi:

if ($request_uri ~* "\/\/") {
  rewrite ^/(.*)      $scheme://$host/$1    permanent;
}

Tham chiếu: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/


Liên kết tham khảo là những gì bạn cần kiểm tra. Giải pháp đúng là ở đó. Tôi sẽ cố gắng để chỉnh sửa câu trả lời.
Anup Nair

1

Thử cái này:

merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;

Có thể có nhiều chuyển hướng cho dấu gạch chéo> 3 hoặc nhiều nhóm dấu gạch chéo.


'merge_slashes off' không có sự khác biệt và dẫn đến không có thay đổi.
Anup Nair

1
Tại sao không merge_slashes on;làm việc? Là nginx lỗi?
Jonathan

1
@Jonathan - Tôi cũng đã bắt gặp điều này. Sự hiểu biết của tôi, đó là merge_slashes onkhông làm những gì bạn đang nghĩ. Về cơ bản, nó bảo nginx lấy // và / và /// dưới dạng một dấu gạch chéo (không tự hợp nhất và chuyển hướng)
Andrew Newby

1

Tôi nói từ kinh nghiệm chạy nhiều máy chủ sản xuất và máy chủ dev cho một nhóm. Đừng làm điều này trong nginx. Thay vào đó, hãy sử dụng bộ định tuyến của bạn trong máy chủ ứng dụng của bạn (JS / PHP, v.v.).

Nginx không đáng tin cậy cho công việc thực chất. Ví dụ: chuyển hướng, viết lại và ifmệnh đề là không xác định nếu bạn thay đổi thiết lập của mình để sử dụng SSL, proxy ngược, cổng ẩn, v.v. Vì vậy, bạn có thể làm cho nó hoạt động chính xác trong một môi trường, nhưng không thể làm việc trong một môi trường khác.

Bám sát một ngôn ngữ lập trình thích hợp để giải quyết các vấn đề, thậm chí đơn giản như hợp nhất các dấu gạch chéo kép. Bạn sẽ cảm ơn tôi sau.


Mặc dù tôi đồng ý quan điểm của bạn, tôi tin rằng chúng ta nên cung cấp cho mọi người tùy chọn để đưa ra ý kiến ​​của riêng họ về vấn đề này. Tôi thích Apache hơn Nginx, với cùng lý do hơn bạn. Lưu ý, Apache mod_rewrite cũng có thể được coi là ngôn ngữ lập trình đơn giản. :-)
peterh - Phục hồi Monica


-1

URL example.com//dir1////dir2///dir3 và hơn thế nữa Hãy thử nó hoạt động với tôi

merge_slashes tắt; vị trí ~ ^ (. *?) // + (. *?) $ {trả lại 301 $ 1 / $ 2; }

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.