วิธีเปลี่ยนเส้นทาง URL เดียวใน nginx


111

ฉันอยู่ระหว่างการจัดโครงสร้าง URL ใหม่ ฉันต้องการตั้งค่ากฎการเปลี่ยนเส้นทางสำหรับ URL เฉพาะ - ฉันใช้ NGINX

โดยทั่วไปสิ่งนี้:

http://example.com/issue1 --> http://example.com/shop/issues/custom_issue_name1
http://example.com/issue2 --> http://example.com/shop/issues/custom_issue_name2
http://example.com/issue3 --> http://example.com/shop/issues/custom_issue_name3

ขอบคุณ!


3
มัน "isse" หรือ "issue"?! คำตอบถือว่าเป็น "ปัญหา" ...
Matthew Wilcoxson

เป็นปัญหาแก้ไขการพิมพ์ผิด
tokmak

คำตอบ:


122

ใส่สิ่งนี้ในคำสั่งเซิร์ฟเวอร์ของคุณ:

location /issue {
   rewrite ^/issue(.*) http://$server_name/shop/issues/custom_issue_name$1 permanent;
 }

หรือทำซ้ำ:

location /issue1 {
   rewrite ^/.* http://$server_name/shop/issues/custom_issue_name1 permanent;
}
location /issue2 {
   rewrite ^.* http://$server_name/shop/issues/custom_issue_name2 permanent;
}
 ...

139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}

@Cybolic ฉันเพิ่งทดสอบสิ่งนี้กับภาพนักเทียบท่าด้วยเวอร์ชัน1.10.3และเรียบร้อยดีคุณสามารถให้ไฟล์ config ของคุณได้หรือไม่? คุณอาจจะขาดอะไรบางอย่าง
Mohammad AbuShady

34

หากคุณต้องการทำซ้ำการเปลี่ยนเส้นทางมากกว่าสองสามครั้งคุณอาจพิจารณาใช้แผนที่:

# map is outside of server block
map $uri $redirect_uri {
    ~^/issue1/?$    http://example.com/shop/issues/custom_isse_name1;
    ~^/issue2/?$    http://example.com/shop/issues/custom_isse_name2;
    ~^/issue3/?$    http://example.com/shop/issues/custom_isse_name3;
    # ... or put these in an included file
}

location / {
    try_files $uri $uri/ @redirect-map;
}

location @redirect-map {
    if ($redirect_uri) {  # redirect if the variable is defined
        return 301 $redirect_uri;
    }
}

4
นี่คือสิ่งที่ฉันมาที่นี่เพื่อค้นหาการใส่ไฟล์เหล่านี้ไว้ในไฟล์ที่รวมอยู่เป็นวิธีที่ยอดเยี่ยมในการแทนที่ไฟล์. htaccess ที่เต็มไปด้วย RewriteRules จาก apache
Josh จาก Qaribou

3
คุณจะรวมแนวทางแผนที่นี้เข้ากับการตั้งค่าประเภทตำแหน่ง / ... proxy_pass ที่มีอยู่ได้อย่างไร
Michael Dausmann

ใน@redirect-mapตำแหน่งที่คุณสามารถลองif ($redirect_uri = "") {return 404;}ตามด้วยสิ่งที่ proxy_pass อาจต้องเขียน$redirect_uriซ้ำโดยใช้ไฟล์.
Cole Tierney

อาจจำเป็นต้องใช้แทน 2 locationบล็อกขึ้นอยู่กับการตั้งค่าของคุณ นี่คือสำหรับ Craft CMS เช่น location ~ ^(.*)$ { if ($redirect_uri) { # redirect if the variable is defined return 301 $redirect_uri; } try_files $uri $uri/ /index.php?p=$uri&$args; }
luwes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.