Apache: วิธีที่ดีที่สุดในการจัดการการเปลี่ยนเส้นทางถาวรนับพันคืออะไร


20

เรามีรายการการเปลี่ยนเส้นทาง 3000 301 เราต้องการความช่วยเหลือ

  1. สิ่งที่ดีที่สุดที่จะนำสิ่งเหล่านี้มา? ดูเหมือนว่าการใส่ 3000 เส้นเหล่านี้ไว้ใน vhost ใน httpd.conf น่าจะเป็นระเบียบ
  2. มีวิธีใดบ้างที่แนะนำในการจัดการ URL หลายพันรายการ
  3. จะมีผลต่อความเร็วในการโหลดหน้าและโหลดเซิร์ฟเวอร์ apache เท่าใด

ขอบคุณ

คำตอบ:


29

คุณสามารถใช้Includeคำสั่งhttpd.confเพื่อให้สามารถรักษาการเปลี่ยนเส้นทางในไฟล์อื่นได้ แต่มันจะไม่มีประสิทธิภาพมากเพราะทุกคำขอจะต้องมีการตรวจสอบกับการแสดงออกปกติจำนวนมาก นอกจากนี้ยังต้องมีการรีสตาร์ทเซิร์ฟเวอร์หลังจากการเปลี่ยนแปลงทุกครั้งในไฟล์

วิธีที่ดีกว่าสำหรับการเปลี่ยนเส้นทางจำนวนมากคือการใช้คำสั่งRewriteMapdbmเพื่อพิมพ์แผนที่จาก URI เพื่อเปลี่ยนเส้นทาง วิธีนี้จะมีประสิทธิภาพเนื่องจากการค้นหา dbm นั้นรวดเร็วมากและหลังจากการเปลี่ยนแปลงในแผนที่คุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์เนื่องจากhttpdตรวจสอบเวลาการแก้ไขไฟล์แผนที่

กฎการเขียนซ้ำจะมีลักษณะเช่นนี้ (ทดสอบบนคอมพิวเตอร์ Fedora 16 ของฉัน):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

และแผนที่ dbm จะถูกสร้างขึ้นจาก text map ซึ่งมี/etc/httpd/conf/redirects.txtลักษณะดังนี้:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

ใช้คำสั่ง

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db

ขอบคุณสำหรับคำตอบ. ฉันลองแล้ว แต่ได้รับข้อผิดพลาด: เนื้อหาหนึ่งไฟล์ของฉันเปลี่ยนเส้นทาง. txt (ค่าคั่นด้วยช่องว่าง) mydomain.com/experiment mydomain.com/new_page มันทำให้ฉันมีข้อผิดพลาดในการแยกวิเคราะห์บรรทัด 'RewriteCond $ {การเปลี่ยนเส้นทาง: $ 1}! = ""' . ข้อผิดพลาดทางไวยากรณ์ในบรรทัดที่ 314 ของ /usr/local/apache/conf/httpd.conf: RewriteCond: ตัวคั่นแฟล็กที่ไม่ดีฉันแสดงความคิดเห็นว่า out แล้ว apache เริ่มทำงาน แต่การเข้าสู่mydomain.com/experiment (หรือ url อื่น ๆ จาก mydomain) ทำให้ฉันมีข้อผิดพลาด "คำขอถูกเปลี่ยนเส้นทางในลักษณะที่ไม่สามารถทำให้เสร็จ"
ucker

Apache ไม่เริ่มต้นใหม่ด้วยข้อมูลโค้ดด้านบน คุณช่วยได้ไหม ฉันไม่เห็นข้อผิดพลาดใด ๆ ที่เกี่ยวข้องกับสิ่งนี้ในไฟล์บันทึกใด ๆ
ucker

ฉันบอกว่ามันยังไม่ผ่านการทดสอบ - ฉันคาดว่ามันจะต้องมีการปรับแต่ง ฉันคิดว่ามันคงจะเพียงพอแล้ว Httpd ไม่ได้เริ่มเนื่องจากไม่มีช่องว่างระหว่าง!=และ""- ฉันได้แก้ไขตัวอย่างของฉันเป็นเวอร์ชันที่ใช้งานได้และทดสอบแล้ว
Tometzky

อีกหนึ่งความคิดเห็น: คุณจะต้องใช้วิธีการอื่นหากการเปลี่ยนเส้นทางของคุณต้องขึ้นอยู่กับสตริงข้อความค้นหา (ทุกอย่างหลังจาก?ใน URL) แต่ก็เป็นไปได้เช่นกัน มันเป็นตอนนี้มันก็จะเพิ่มสตริงแบบสอบถามเพื่อเปลี่ยนเส้นทางเช่นจะเปลี่ยนเส้นทางไปยังhttp://yourserver.com/foo?q=bar http://serverfault.com/?q=bar
Tometzky

ขอบคุณสำหรับการอัพเดท. ข้อผิดพลาดให้RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db RewriteMap dbm type db is invalidแต่เมื่อฉันใช้RewriteMap redirects txt:/etc/httpd/conf/redirects.txtมันทำงาน ฉันยังต้องการใช้วิธีแฮชเหมือนที่คุณอธิบายแทนที่จะเป็นข้อความธรรมดา แต่ฉันไม่พบข้อผิดพลาด dbm มากนัก ขอบคุณสำหรับความช่วยเหลือของคุณ.
14124 ucker เมื่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.