วิธีลบเครื่องหมายทับสองครั้งใน URL ที่ให้บริการโดย nginx


9

ฉันจำเป็นต้องทำซ้ำกฎการเขียน Apache ต่อไปนี้ใน Nginx config บน Ubuntu 12.04 อะไรคือ nginx ที่เทียบเท่ากับ:

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


ใครก็ตามที่พบสิ่งนี้ทางออนไลน์และพยายามคัดลอกคำตอบที่แนะนำโปรดระวังหากคุณกำลังใช้การตั้งค่า Virtualbox ด้วยพอร์ตที่กำหนดเอง ฉันต้องเปลี่ยนให้เป็นเช่นrewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;ที่4321เป็นพอร์ตภายนอกของ Virtualbox ที่จะ nginx เบราว์เซอร์ของฉันเชื่อมต่อกับ
aexl

คำตอบ:


6

ฉันอยากจะแนะนำวิธีนี้:

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

มันใช้พฤติกรรมเริ่มต้นของ nginx - การรวมกันของเครื่องหมายทับดังนั้นเราไม่จำเป็นต้องแทนที่เครื่องหมายทับเราเพียงแค่เปลี่ยนเส้นทาง

พบได้ที่นี่



วิธีนี้ใช้ไม่ได้กับ SSL ผ่าน certbot หากคุณมี nginx ในฐานะ reverse proxy ผ่าน proxy_pass
Jonathan

3

ฉันพบว่าการตอบสนองของ kwo ไม่ทำงาน ดูบันทึกการดีบักของฉันนี่คือสิ่งที่เกิดขึ้น:

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"

ฉันพบสิ่งนี้ใช้งานได้สำหรับฉัน:

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

Ref: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/


ลิงค์อ้างอิงคือสิ่งที่คุณต้องตรวจสอบ ทางออกที่ถูกต้องอยู่ในนั้น ฉันจะพยายามแก้ไขคำตอบ
Anup Nair

1

ลองสิ่งนี้:

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

อาจมีการเปลี่ยนเส้นทางหลายครั้งสำหรับเครื่องหมายทับ> 3 หรือหลายกลุ่มของเครื่องหมายทับ


'merge_slash off' ไม่ได้สร้างความแตกต่างและทำให้ไม่มีการเปลี่ยนแปลง
Anup Nair

1
ทำไมไม่merge_slashes on;ทำงาน nginx buggy หรือไม่?
Jonathan

1
@ Jonathan - ฉันเพิ่งเจอสิ่งนี้เช่นกัน ความเข้าใจของฉันคือmerge_slashes onว่าไม่ได้ทำในสิ่งที่คุณคิด โดยทั่วไปแล้วจะบอกให้ nginx ใช้ // และ / และ /// เป็นเครื่องหมายทับ (เพื่อไม่ให้รวมและเปลี่ยนเส้นทางด้วยตัวเอง)
Andrew Newby

1

ฉันพูดจากประสบการณ์ของการใช้เซิร์ฟเวอร์ที่ใช้งานจริงจำนวนมากและเซิร์ฟเวอร์ dev สำหรับทีม อย่าทำเช่นนี้ใน nginx ให้ใช้เราเตอร์ของคุณแทนแอปพลิเคชันเซิร์ฟเวอร์ (JS / PHP ฯลฯ ) แทน

Nginx ไม่น่าเชื่อถือสำหรับงานที่สำคัญ ตัวอย่างเช่นการเปลี่ยนเส้นทางเขียนใหม่และส่วนifคำสั่งไม่สามารถกำหนดค่าได้หากคุณเปลี่ยนการตั้งค่าเพื่อใช้ SSL พร็อกซีย้อนกลับพอร์ตที่ซ่อนอยู่และอื่น ๆ ดังนั้นคุณอาจทำให้มันทำงานอย่างถูกต้องในสภาพแวดล้อมหนึ่ง แต่มันเป็นไปไม่ได้ที่จะทำงานในสภาพแวดล้อมอื่น

ยึดภาษาการเขียนโปรแกรมที่เหมาะสมสำหรับการแก้ปัญหาแม้จะง่ายเหมือนการรวมเครื่องหมายทับสองครั้ง คุณจะขอบคุณฉันในภายหลัง


ในขณะที่ฉันเห็นด้วยกับมุมมองของคุณฉันเชื่อว่าเราควรให้ทางเลือกแก่ผู้คนในการสร้างความคิดเห็นของตนเองเกี่ยวกับเรื่องนี้ ฉันชอบ Apache กับ Nginx ด้วยเหตุผลเดียวกันกับของคุณ หมายเหตุ Apache mod_rewrite ถือได้ว่าเป็นภาษาโปรแกรมอย่างง่ายเช่นกัน :-)
peterh - Reinstate Monica


-1

URL example.com//dir1////dir2///dir3 และอื่น ๆ ลองใช้วิธีนี้ใช้ได้กับฉัน

merge_slash off; ตำแหน่ง ~ ^ (. *?) // + (. *?) $ {ส่งคืน 301 $ 1 / $ 2; }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.