Nginx เปลี่ยนเส้นทางหนึ่งเส้นทางไปยังเส้นทางอื่น


51

ฉันแน่ใจว่าสิ่งนี้ถูกถามมาก่อน แต่ฉันไม่สามารถหาวิธีแก้ปัญหาที่ใช้งานได้

เว็บไซต์เปลี่ยนบริการ CMS แต่มีโดเมนเดียวกันฉันจะตั้งค่าการเขียนซ้ำ nginx สำหรับหน้าเดียวได้อย่างไร

เช่น

หน้าเก่า

http://sitedomain.co.uk/content/unique-page-name

หน้าใหม่

http://sitedomain.co.uk/new-name/unique-page-name

โปรดทราบว่าฉันไม่ต้องการให้ทุกสิ่งในหน้าเนื้อหาถูกเปลี่ยนเส้นทาง แต่แท้จริงแล้วเพียงแค่ URL ที่กล่าวถึงข้างต้น ฉันมีการเปลี่ยนเส้นทางประมาณ 9 รายการซึ่งไม่ใช่รูปแบบที่เหมาะสม

ขอบคุณ!

แก้ไข: ฉันพบโซลูชันนี้ซึ่งดูเหมือนว่าจะใช้งานได้ยกเว้นความจริงที่ว่ามันเปลี่ยนเส้นทางโดยไม่มีเครื่องหมายทับ:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}

แต่นี่เป็นการเปลี่ยนเส้นทางไปที่:

http://sitedomain.co.uknew-name/unique-page-name/

คำตอบ:


87

อ้างโดยตรงจากข้อผิดพลาดและข้อผิดพลาดทั่วไป: การเดินทางโดยรถแท็กซี่ :

โดยใช้คำสั่งส่งคืนเราสามารถหลีกเลี่ยงการประเมินการแสดงออกปกติ

โปรดใช้returnแทนrewriteการเปลี่ยนเส้นทางแบบถาวร นี่คือวิธีการของฉันในการใช้งานกรณีนี้ ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

1
มันอ่านได้มากขึ้นอย่างแน่นอน สิ่งนี้จะรักษาข้อความค้นหาใด ๆ ที่อยู่บน URL เดิมหรือไม่
SteveEdson

1
Nope มันจะไม่ หากคุณต้องการเก็บคำถามใด ๆ ไว้ตามการเปลี่ยนเส้นทางแบบถาวรดูเคล็ดลับเล็ก ๆ นี้ ... gist.github.com/pothi/7152399
Pothi Kalimuthu

1
ฉันคิดifถูกไหมว่าการใช้คำสั่งใน nginx นั้นไม่ดี? นี่จะเป็นวิธีที่ดีกว่าการใช้วิธีการเขียนซ้ำหรือไม่
SteveEdson

1
การใช้งานifพร้อมกับคำสั่งคืนสินค้านั้นสมบูรณ์แบบมาก ดูwiki.nginx.org/IfIsEvil ใช่ IMO ดีกว่าการใช้การเขียนซ้ำ
Pothi Kalimuthu

13

เป็นการดีที่คุณไม่ควรใช้ถ้าคำสั่งถ้าคุณสามารถหลีกเลี่ยงได้ สิ่งนี้สามารถใช้งานได้ (ยังไม่ทดลอง)

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 

1
จะไม่จับทุกอย่างที่อยู่ในไดเรกทอรีเนื้อหาหรือไม่ ฉันต้องการเปลี่ยนเส้นทางของแต่ละรายการ ตัวอย่างเช่นฉันมีรายการอื่นในไดเรกทอรีเนื้อหา แต่ฉันต้องการให้เปลี่ยนเส้นทางไปที่ ... / another-new-name / unique-page-name2
SteveEdson

1
ฉันแก้ไขมันแล้ว กลับกลายเป็นว่าเปลี่ยนเส้นทางอย่างถูกต้อง แต่สคริปต์ที่ถูกตีถูก mangling URL หลังจาก
SteveEdson

1
อ่าฉันเข้าใจผิดคำถาม ฉันคิดว่าคุณต้องการเพียงแค่ส่วนเนื้อหาในการเปลี่ยนแปลง หลักการยังคงเหมือนเดิม ฉันดีใจที่มันทำงานให้คุณ
Gevious

1
ไม่มีปัญหาขอบคุณสำหรับความช่วยเหลือแม้ว่าฉันจะต้องใช้มันในอนาคต
SteveEdson

12

ฉันใช้โซลูชันต่อไปนี้:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/$2 permanent;

ทำงานรักษา


8

สำหรับฉันมันใช้งานได้โดยไม่มีเครื่องหมายเท่ากับ:

location /old-url {
  return 301 /new-url;
}

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