Score:1

กฎการเขียนใหม่สำหรับ URL ด้วยข้อความค้นหาไม่ทำงาน

ธง cn

ฉันเขียนกฎการเขียนซ้ำต่อไปนี้:

<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} rp=\/knowledgebase\/.*
RewriteRule ^\/customer\/index.php /knowledgebase/ [R=301,L]
RewriteRule ^\/customer\/knowledgebase\.php$ /knowledgebase/ [R=301,L,QSA]
</IfModule>

เพื่อเปลี่ยนเส้นทาง URL เช่น

https://www.example.com/customer/index.php?rp=/knowledgebase/5/DataNumen-Excel-Repair ถึง https://www.example.com/knowledgebase/

และเปลี่ยนเส้นทาง URL เช่น

https://www.example.com/customer/knowledgebase.php ถึง https://www.example.com/knowledgebase/

แต่ทั้งสองไม่ทำงาน ทำไม

อัปเดต

ฉันพยายามใส่โค้ดของ MrWhite จาก /.htaccess เป็น /customer/.htaccess และทำการเปลี่ยนแปลงเล็กน้อยเพื่อรับการเปลี่ยนแปลง ดังด้านล่าง:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.example.com/knowledgebase/ [QSD,R=301,L,NC]

RewriteRule ^knowledgebase\.php$ https://www.example.com/knowledgebase/ [R=301,L,NC]

ตอนนี้การเปลี่ยนเส้นทางใช้งานได้ อย่างไรก็ตาม จะใช้ได้ในกรณีเช่น:

https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-ซ่อมแซม

แต่สำหรับกรณีเช่น

https://www.example.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair

มันจะไม่ทำงาน แม้ว่าฉันจะเปลี่ยน ^rp= เป็น rp ใน RewriteCond

Score:1
ธง kz

RewriteRule ^/customer/index.php /knowledgebase/ [R=301,L]

ใน .htaccess, เส้นทาง URL ที่ตรงกับ เขียนกฎใหม่ ลวดลาย (เช่น. ^\/customer\/index.php) ไม่ขึ้นต้นด้วยเครื่องหมายทับ ดังนั้นสิ่งนี้จะไม่ตรงกันเส้นทาง URL ที่ตรงกันสัมพันธ์กับ ไดเรกทอรี ที่ประกอบด้วย .htaccess ไฟล์ (น้อยกว่าคำนำหน้าเครื่องหมายทับ) (ไม่เหมือนกับที่ใช้ในก เซิร์ฟเวอร์ บริบท เมื่อเส้นทาง URL ที่ตรงกันคือเส้นทาง URL ญาติรากเอกสาร โดยขึ้นต้นด้วยเครื่องหมายทับ)

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

จุดเล็กน้อย... ไม่จำเป็นต้องมีแบ็กสแลช-เอสเคปสแลชใน Apache regex ตั้งแต่นั้นมา ช่องว่าง เป็นตัวคั่นอาร์กิวเมนต์และเครื่องหมายทับไม่มีความหมายพิเศษอย่างอื่นใน regex

ลองทำสิ่งต่อไปนี้แทน:

RewriteEngine เปิดอยู่

RewriteCond %{QUERY_STRING} ^rp=/knowledgebase/
RewriteRule ^customer/index\.php$ /knowledgebase/ [QSD,R=301,L]

RewriteRule ^customer/knowledgebase\.php$ /knowledgebase/ [R=301,L]

ฉันยึดสตริงข้อความค้นหาในไฟล์ เงื่อนไข ก็เลยเข้ากัน rp=... ที่จุดเริ่มต้นของสตริงข้อความค้นหา ดังตัวอย่างของคุณ เดอะ .* ในตอนท้ายของ regex ไม่จำเป็น

เดอะ คำพูดคำจา ไม่จำเป็นต้องตั้งค่าสถานะในกฎข้อที่ 2 เนื่องจากสตริงการสืบค้นจะถูกส่งผ่านตามค่าเริ่มต้น เดอะ คำพูดคำจา แฟล็กจะต้องใช้ในกรณีที่จำเป็นเท่านั้น ผสาน สตริงข้อความค้นหาเดิมในคำขอด้วยสตริงข้อความค้นหาใหม่ที่คุณต่อท้ายใน การแทน.

เดอะ <IfModule> ไม่จำเป็นต้องใช้ wrapper เว้นแต่จะมีคำสั่งเหล่านี้ ไม่จำเป็น และตั้งใจให้ใช้กับหลายเซิร์ฟเวอร์ซึ่ง mod_rewrite อาจไม่สามารถใช้ได้ ดูคำถามนี้ในกลุ่มผู้ดูแลเว็บ: https://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessary

คุณควรทดสอบก่อนด้วยการเปลี่ยนเส้นทาง 302 (ชั่วคราว) เพื่อหลีกเลี่ยงปัญหาการแคชที่อาจเกิดขึ้น


อัปเดต: เพื่อทำให้ทุกอย่างง่ายขึ้น ฉันใส่กฎการเขียนซ้ำให้กับ .htaccess ไฟล์ภายใต้ /ลูกค้า แทน /. ฉันได้อัปเดตโพสต์ของฉันตามนั้น

ในกรณีนั้น คุณจะต้องลบไฟล์ ลูกค้า/ คำนำหน้าในแต่ละ เขียนกฎใหม่ รูปแบบตามที่คุณได้ทำไปแล้วในคำถามที่อัปเดตแล้ว

ถ้า รอบ พารามิเตอร์ URL มีวัตถุประสงค์เพื่อให้ตรงกับที่ใดก็ได้ในสตริงการสืบค้น ดังนั้นคุณควรเปลี่ยน CondPattern อ่าน (^|&)rp=/ฐานความรู้/แทนที่จะเพียงแค่ลบ ^ คำนำหน้า โดยเอา ^ คำนำหน้าคุณอาจตรงกันมากเกินไป เช่น abcrp=/ฐานความรู้/... ก็จะตรงกันแม้ว่าในความเป็นจริงแล้วมันอาจจะใช่หรือไม่ใช่ประเด็นก็ตาม

มิฉะนั้น คำสั่งที่อัปเดตเหล่านั้นจะดูใช้ได้ ขึ้นอยู่กับข้อขัดแย้งอื่นๆ ที่อาจมีอยู่ในคำสั่งอื่นๆ การแคชอาจเป็นปัญหาเช่นกัน โดยเฉพาะอย่างยิ่งหากคุณใช้ CDN

alancc avatar
cn flag
ขออภัยที่ยังใช้งานไม่ได้ ขอบคุณมาก.
kz flag
@alancc คุณหมายถึงอะไรโดย "ไม่ทำงาน" กันแน่? คุณได้รับข้อผิดพลาดหรือไม่? การเปลี่ยนเส้นทางไม่ถูกต้อง? ไม่มีอะไร? ไฟล์ `.htaccess` ของคุณอยู่ที่ไหน คุณมีคำแนะนำอื่น ๆ หรือไม่? ไฟล์ `.htaccess` อื่น ๆ อีกไหม
alancc avatar
cn flag
@MrWrite ขอบคุณมากครับ "ไม่ทำงาน" หมายถึงเมื่อฉันป้อน URL เช่น https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair แล้วไม่มีอะไรเกิดขึ้นฉันตรวจสอบรหัสตอบกลับและมันแสดง 200 ฉันเดาว่าอาจเป็นเพราะไฟล์ .htaccess หลายไฟล์ ดังนั้นเพื่อให้ง่ายขึ้น ฉันจึงใส่กฎการเขียนใหม่ให้กับไฟล์ .htaccess ภายใต้ /customer แทน / ฉันได้อัปเดตโพสต์ของฉันตามนั้น
kz flag
@alancc คำสั่งที่เขียนในคำตอบของฉันมีจุดประสงค์เพื่อไปในไฟล์รูท `.htaccess` หากคุณใส่ไว้ในไดเร็กทอรีย่อย `/customer` คุณจะต้องแก้ไขตามที่คุณทำในคำถามที่อัปเดต คำสั่งในคำถามที่อัปเดตของคุณดูดี (โดยลบคำนำหน้า `^` เพื่อให้ตรงกับ URL ที่ 2 - แม้ว่าตอนนี้เนื้อหาจะตรงกันมากเกินไป) อย่างไรก็ตาม คุณมีคำสั่งอื่นใดในไฟล์ `/customer/.htaccess` หรือไม่ การเปลี่ยนเส้นทางภายนอกใดๆ เช่นนี้ต้องอยู่ใกล้ด้านบนสุด ไฟล์ `.htaccess` หลายไฟล์อาจเป็นปัญหาได้ คุณใช้ rewrite _inheritance_ เลยหรือเปล่า
alancc avatar
cn flag
ขอบคุณมาก. ฉันตรวจสอบ /customer/.htaccess อีกครั้ง หลังจากเขียนกฎใหม่แล้ว จะมี AddHandler ซึ่งสร้างโดย cPanel โดยอัตโนมัติ และนั่นคือคำสั่งสุดท้ายใน .htaccess URL จริงคือ https://www.datanumen.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair แม้ว่าตอนนี้ Cloudflare เปิดใช้งานแล้ว ฉันได้ลองเมื่อปิดใช้งาน และไม่ทำงานด้วย
kz flag
@alancc ฉันเห็นว่า URL เปลี่ยนเส้นทางตามที่ตั้งใจไว้ ทำอะไรเพื่อแก้ไขปัญหานี้ มันเป็นปัญหาการแคชหรือไม่? "AddHandler ซึ่งสร้างโดย cPanel โดยอัตโนมัติ" - cPanel ไม่ควรแก้ไขไฟล์ `.htaccess` ในไดเร็กทอรีย่อยใช่หรือไม่ โดยปกติแล้ว `AddHandler` จะอยู่ในไฟล์รูท `.htaccess` เท่านั้น (?)
alancc avatar
cn flag
ฉันเดาว่าเป็นเพราะ Cloudflare Cache แม้ว่าฉันจะหยุด Cloudflare บนไซต์ของฉันชั่วคราวเมื่อฉันทำการทดสอบ แคชหรือบางสิ่งอาจยังคงอนุมานได้ ตอนนี้แคชหมดอายุแล้ว ใช่ โดยปกติแล้ว Addhandler ควรใช้สำหรับ root .htaccessอย่างไรก็ตาม ในกรณีของฉัน ลูกค้าใช้ WHMCS ซึ่งมักจะไม่รองรับเวอร์ชันล่าสุดของ PHP ดังนั้นฉันจึงต้องตั้งค่าเวอร์ชันอื่นใน subdir นั้น ขอบคุณมากสำหรับการชี้ให้เห็นสิ่งนี้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา