คุณสามารถทำได้ดังต่อไปนี้โดยใช้ mod_rewrite:
RewriteEngine เปิดอยู่
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
RewriteRule ^/?(หน้าของฉัน)$ /$1/%1/%2 [QSD,R=302,L]
ครั้งแรก เงื่อนไข จับคุณค่าของ หน้า 1
และส่งต่อสิ่งนี้ไปยังครั้งที่สอง เงื่อนไข ที่ยังจับคุณค่าของ พี 2
. สิ่งเหล่านี้จะถูกนำไปใช้ใน การแทน สตริงเป็น %1
และ %2
การอ้างอิงย้อนกลับตามลำดับ
พารามิเตอร์ URL สามารถเกิดขึ้นได้ในลำดับใดก็ได้
@
(ในเงื่อนไขที่สอง) เป็นเพียงอักขระตามอำเภอใจที่ไม่ได้เกิดขึ้นใน v1
และใช้เป็นตัวคั่นระหว่าง v1
และสตริงข้อความค้นหาเมื่อค้นหา พี 2
.
พารามิเตอร์ URL อื่นๆ ทั้งหมด (เช่น หน้า 3
..พี.เอ็น
) ถูกละเว้น (และละทิ้ง)
ทั้งคู่ หน้า 1
และ พี 2
ต้องมีค่าที่ไม่ว่างสำหรับการเปลี่ยนเส้นทางที่จะเกิดขึ้น
อัปเดต: หน้า 1
ต้องมีค่าที่ไม่ว่างเปล่า (มิฉะนั้น การเปลี่ยนเส้นทางที่ได้จะคลุมเครือ) พี 2
ต้องมีด้วย แต่ค่าที่ได้ ว่างเปล่า. ฉันได้อัปเดต regex ด้วยเพื่อที่จะอนุญาตสตริงข้อความค้นหาที่มีรูปแบบไม่ถูกต้อง (แต่ยังคงใช้ได้) โดยที่ตัวคั่นพารามิเตอร์ URL (&
) เกิดขึ้นก่อน พี 2
ที่จุดเริ่มต้นของสตริงข้อความค้นหา เช่น. /หน้าของฉัน?&p2=&p1=v1
จะยังคงถูกเปลี่ยนเส้นทางไปที่ /หน้าของฉัน/v1/
.
เดอะ คำพูด
ตั้งค่าสถานะละทิ้งสตริงการสืบค้นดั้งเดิมจากคำขอ
ขึ้นอยู่กับตำแหน่งที่ใช้คำสั่งเหล่านี้ (เช่น ไดเรกทอรี หรือ เซิร์ฟเวอร์ บริบท) และวิธีการกำหนดเส้นทาง URL ในท้ายที่สุด คุณอาจต้องเพิ่ม สภาพเริ่มต้น เพื่อให้แน่ใจว่ามีการประมวลผลเฉพาะคำขอโดยตรง (ตรงข้ามกับคำขอที่เขียนใหม่)
ตัวอย่างเช่น เพิ่มสิ่งต่อไปนี้เป็นเงื่อนไขแรก ถ้าจำเป็น:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
อัปเดต:
p1 และ p2 เป็นข้อบังคับ p3 เป็นตัวเลือก
คุณสามารถเปลี่ยนด้านบนดังต่อไปนี้:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# p3 เป็นค่าบังคับและต้องมีค่า
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [OR]
# OR p3 ถูกละไว้หรือไม่มีค่า
การเขียนซ้ำ Cond %1/%2 (.+)
RewriteRule ^/?(my-page)$ /$1/%1%2 [QSD,R,L]
เงื่อนไขที่ 2 ทำให้แน่ใจว่ามีค่าสำหรับ พี 2
พารามิเตอร์ (เช่น v2
) - ต้องไม่ว่างเปล่า
จากนั้นเงื่อนไขที่ 3 จะตรวจสอบความไม่ว่างเปล่า หน้า 3
พารามิเตอร์ หรือ เงื่อนไขที่ 4 เพียงแค่จับค่าเมื่อ หน้า 3
พารามิเตอร์ว่างเปล่าหรือข้ามไปเลย
การเปลี่ยนเส้นทางที่เป็นผลลัพธ์จะไม่ใช้เครื่องหมายทับต่อท้ายเมื่อ หน้า 3
ไม่มีอยู่ ตัวอย่างเช่น การเปลี่ยนเส้นทางที่เป็นผลลัพธ์จะเป็นอย่างใดอย่างหนึ่ง /mypage/v1/v2
หรือ /mypage/v1/v2/v3
. (เครื่องหมายทับท้ายที่อาจเกิดขึ้นบน /mypage/v1/v2/
หลีกเลี่ยงได้)
ในรอบชิงชนะเลิศ การแทน สตริง ค่าของ %1
และ %2
การอ้างอิงย้อนกลับจะแตกต่างไปจากก่อนหน้านี้เล็กน้อย ค่าเหล่านี้ไม่มีแต่ละค่าอีกต่อไป (เช่น v1
และ v2
). แทน %1
ประกอบด้วย v1/v2
และ %2
มีทั้ง /v3
(รวมถึงคำนำหน้าเครื่องหมายทับ) หรือ is ว่างเปล่า (เมื่อไร หน้า 3
ว่างหรือละไว้)