คุณสามารถทำได้ด้วยการล่ามโซ่หลายอัน แผนที่
บล็อก นี่คือแนวคิด:
แผนที่ $arg_p $url_p {
ติดต่อ / ติดต่อ;
$url_id แบบคงที่;
แค็ตตาล็อก $url_action;
# ค่าเริ่มต้นจะเป็นสตริงว่าง
}
แผนที่ $arg_id $url_id {
อาชีพ / อาชีพ;
เกี่ยวกับ / เกี่ยวกับ;
# เพจสแตติกอื่นเปลี่ยนเส้นทางไปที่ /about
ค่าเริ่มต้น / เกี่ยวกับ;
}
แผนที่ $arg_action $url_action {
รูปภาพ $url_cat_id;
ดูภาพ $url_pid;
การกระทำที่ไม่แสดงอีก # รายการมีค่าเริ่มต้นเป็น /product
ค่าเริ่มต้น / ผลิตภัณฑ์;
}
แผนที่ $arg_cat_id $url_cat_id {
1 /หมวดสินค้า/หมวดทาก-1;
2 /หมวดสินค้า/หมวดทาก-2;
อีก # หมวดหมู่ที่ไม่แสดงควรเปลี่ยนเส้นทางไปยัง /product-categories
ค่าเริ่มต้น /หมวดสินค้า;
}
แผนที่ $arg_pid $url_pid {
1 /ผลิตภัณฑ์/ผลิตภัณฑ์ทาก-1;
2 /ผลิตภัณฑ์/ผลิตภัณฑ์ทาก-2;
สินค้าที่ไม่อยู่ในรายการอีก # รายการมีค่าเริ่มต้นเป็น /product
ค่าเริ่มต้น / ผลิตภัณฑ์;
}
เซิร์ฟเวอร์ {
ฟัง ...
ชื่อเซิร์ฟเวอร์ ...
...
if ($url_p) { # ถ้าตัวแปร '$url_p' ไม่ใช่สตริงว่าง
ส่งคืน 301 $url_p;
}
ที่ตั้ง / {
...
}
...
}
บาง แผนที่
บล็อกสามารถย่อได้ ตัวอย่างเช่น สมมติว่าคุณมีหน้าสแตติก 3 หน้า /อาชีพ
, /ลูกค้า
และหน้า "เริ่มต้น" /เกี่ยวกับ
, 5 หมวดหมู่ และ 45 ผลิตภัณฑ์:
แผนที่ $arg_id $url_id {
~^(อาชีพ|ลูกค้า)$ /$1;
ค่าเริ่มต้น / เกี่ยวกับ;
}
แผนที่ $arg_cat_id $url_cat_id {
~^([1-5])$ /product-category/category-slug-$1;
ค่าเริ่มต้น /หมวดสินค้า;
}
แผนที่ $arg_pid $url_pid {
~^([1-9]|[1-3]\d|4[0-5])$ /product/product-slug-$1;
ค่าเริ่มต้น / ผลิตภัณฑ์;
}
อัปเดต
OP ระบุว่าเขาไม่สามารถใช้งานได้ แผนที่
คำสั่งเนื่องจากเขาไม่มีสิทธิ์เข้าถึงการกำหนดค่า nginx แบบเต็ม แต่ทำได้เท่านั้น เซิร์ฟเวอร์
บล็อกเนื้อหาแม้ว่าโซลูชันก่อนหน้านี้จะสวยงามกว่ามาก (และควรมีประสิทธิภาพมากกว่าในแง่ของประสิทธิภาพ) แต่ก็เป็นไปได้ที่จะทำเช่นเดียวกันโดยใช้เท่านั้น ถ้า
บล็อก:
ถ้า ($arg_p = ผู้ติดต่อ) { ส่งคืน 301 /contact; }
ถ้า ($arg_p = คงที่) { ตั้ง $page static_$arg_id; }
ถ้า ($page = static_career) { กลับ 301 /อาชีพ; }
ถ้า ($ หน้า) { กลับ 301 /เกี่ยวกับ; } # อะไรก็ตามที่ไม่ใช่ 'อาชีพ' เปลี่ยนเส้นทางไปที่ '/เกี่ยวกับ'
ถ้า ($arg_p = แค็ตตาล็อก) { ตั้ง $action $arg_action; }
ถ้า ($ action = รูปภาพ) { ตั้ง $page category_$arg_cat_id; }
ถ้า ($page = category_1) { ส่งคืน 301 /product-category/category-a; }
ถ้า ($page = category_2) { ส่งคืน 301 /product-category/category-b; }
# ...หมวดอื่นๆ
ถ้า ($ action = รูปภาพ) { ส่งคืน 301 / หมวดหมู่สินค้า; } # ระบุหมวดหมู่ที่ไม่แสดง
ถ้า ($action = viewimages) { set $page product_$arg_pid; }
ถ้า ($page = product_1) { ส่งคืน 301 /ผลิตภัณฑ์/ผลิตภัณฑ์-a; }
ถ้า ($page = product_2) { ส่งคืน 301 /ผลิตภัณฑ์/ผลิตภัณฑ์-b; }
# ... ผลิตภัณฑ์อื่น
ถ้า ($ action = viewimages) { ส่งคืน 301 / ผลิตภัณฑ์; } # ผลิตภัณฑ์ที่ไม่อยู่ในรายการที่ระบุ
# หากคุณต้องการดำเนินการใด ๆ ที่ไม่แสดงในรายการในลักษณะพิเศษ
# if ($action) { ... } # อาร์กิวเมนต์การค้นหา 'action' ไม่ใช่ 'images' หรือ 'viewimages'
ส่วนนี้สามารถวางได้ทั้งใน เซิร์ฟเวอร์
หรือ ที่ตั้ง
บริบท.