อัปเดต: วิธีแก้ปัญหาที่ด้านล่าง
ฉันเพิ่งเปลี่ยนจากการใช้การตั้งค่าเช่น index.php?p=page_name&o=temporary_override
และเปลี่ยนไปใช้ URL ที่ปลอดภัยเช่น /page_name/temporary_override
การแทนที่ชั่วคราวเป็นเพียงเพื่อให้ฉันเห็นผลลัพธ์ของการเปลี่ยนแปลงไซต์ในขณะที่กำลังสร้าง
ขณะนี้ฉันได้ตั้งค่า mod_rewrite เป็น:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
ซึ่งจะจับ "ไดเรกทอรีย่อย" จากนั้น PHP จะแยกวิเคราะห์ URL จาก GHPAGE $_GET var สิ่งที่ฉันต้องการคือตั้งค่าการเปลี่ยนเส้นทาง 301 เพื่อให้ใครก็ตามที่ใช้ index.php?p=something&o=something_else จะถูกเปลี่ยนเส้นทางไปที่ /something/something_else มีความคิดใดที่ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร? p & o อาจมาในลำดับใดก็ได้และอย่างใดอย่างหนึ่งอาจไม่มีอยู่
แก้ไข: ตกลง หลังจากความช่วยเหลือจาก @Jon-Lin, @dambrisco และ @anubhava ฉันก็เข้าใกล้มากขึ้น ไฟล์ .htaccess ของฉันตอนนี้ดูเหมือนว่า:
RewriteEngine On
#Base Directory
RewriteBase /test/
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4/%5 [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4 [R=301,L]
#Remove index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ / [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
ขณะนี้กำลังเปลี่ยนเส้นทาง แต่ยังไม่ถึงจุดที่จำเป็นต้องไป root/test/index.php?p=test&o=override
เปลี่ยนเส้นทางไปที่ root/test/override?p=test&o=override
แล้ว ใกล้กว่านี้ แต่ฉันไม่สามารถทราบวิธีกำจัด GET vars ที่ถูกเพิ่มลงใน URL หรือเหตุใดจึงเปลี่ยนเส้นทางไปยังไดเร็กทอรีรูทแทนที่จะไปยังไดเร็กทอรี RewriteBase
แก้ไข:
ขณะนี้มีการเปลี่ยนเส้นทางอย่างถูกต้อง แต่ด้วยเหตุผลบางอย่าง ทำให้โฟลเดอร์ /test/ RewriteBase หลุดออกจากสมการ http://www.domain.com/test/index.php?p=page1&o=operation
กำลังถูกเปลี่ยนเส้นทางไปที่ http://www.domain.com/page1/operation
ไฟล์ .htaccess ใหม่อยู่ด้านล่าง:
RewriteEngine On
RewriteBase /test/
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]
#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ /$ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
ขอบคุณทุกคน. คำถามได้รับการแก้ไขแล้ว สุดท้าย .htaccess อยู่ด้านล่างสำหรับการอ้างอิง
RewriteEngine On
RewriteBase /test/
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ %4/%5? [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ %4? [R=301,L]
#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ ? [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]