คุณสามารถทำได้ดังต่อไปนี้โดยใช้ 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 ว่างหรือละไว้)