Score:1

Apache 2.4 แปลง .htaccess และเขียนใหม่เป็น vhost.conf

ธง pl

ฉันกำลังเขียนการกำหนดค่า Apache 2.4 ใหม่ที่ฉันได้รับจากทีมพัฒนาเก่า

ฉันมีการกำหนดค่าที่คล้ายกันประมาณ 200 บรรทัดและฉันไม่สามารถเข้าใจหลักการใดที่ฉันต้องเปลี่ยนรหัสนี้เพื่อย้ายจาก .htaccess ไปยังโฮสต์เสมือน

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^(.*)$ /$1/ [R,L,NC]

เมื่อฉันเพิ่งย้ายไปยัง virtualhost ไซต์ของฉันขัดข้องในที่ที่ฉันไม่เข้าใจ

Chris avatar
it flag
ใน .htaccess กฎการเขียนซ้ำจะใช้กับไดเร็กทอรีที่มี .htaccess อยู่ ใน virtualhost คุณต้องตั้งกฎเหล่านี้ใน หรือ บล็อก.
pl flag
ขอบคุณ! ฉันพยายามทำวิธีนี้ แต่ดูเหมือนว่ากฎจำเป็นต้องเปลี่ยนแปลงด้วยวิธีใดวิธีหนึ่ง ฉันเข้าใจด้วยว่าต้องแก้ไขเส้นทางของไฟล์ แต่นิพจน์ทั่วไปทำให้ฉันคลั่งไคล้
Score:0
ธง kz

ขึ้นอยู่กับว่าอยู่ส่วนไหนของ <VirtualHost> คอนเทนเนอร์ที่คุณกำลังวางคำสั่งเหล่านี้

หากคุณกำลังใช้ <Directory> คอนเทนเนอร์ (เช่น ก ไดเรกทอรี บริบท) และ ปิดการใช้งาน .htaccess แทนที่ทั้งหมด (มิฉะนั้น .htaccess จะแทนที่ <Directory> คอนเทนเนอร์!) จากนั้นคุณสามารถคัดลอกคำสั่งได้ตามที่เป็นอยู่ (สมมติว่าไฟล์ <Directory> คอนเทนเนอร์อ้างอิงไดเร็กทอรีเดียวกันกับ .htaccess ไฟล์ได้)

อย่างไรก็ตาม หากคุณใส่คำสั่งเหล่านี้โดยตรงใน <VirtualHost> ตู้คอนเทนเนอร์ (นอกก <Directory> ตู้คอนเทนเนอร์) กล่าวคือ ใน โฮสต์เสมือน บริบท คุณต้องทำการเปลี่ยนแปลงบางอย่าง เนื่องจากคำสั่งได้รับการประมวลผลก่อนหน้านี้ ก่อนที่คำขอจะถูกแมปกับระบบไฟล์

ในคำสั่งที่คุณโพสต์ จำเป็นต้องทำการเปลี่ยนแปลงเพียงสองอย่างเท่านั้น:

  • ใน โฮสต์เสมือน บริบท, REQUEST_FILENAME ตัวแปรเซิร์ฟเวอร์ยังไม่ได้รับการแก้ไขเป็น ชื่อไฟล์. ก็เหมือนกับ REQUEST_URI (เช่น URL ที่ร้องขอ) ดังนั้น การตรวจสอบระบบไฟล์ของคุณจะล้มเหลวเสมอ และเงื่อนไขจะสำเร็จเสมอ! คุณต้องใช้การมองไปข้างหน้า เช่น. %{LA-U:REQUEST_FILENAME}หรือสร้างชื่อไฟล์ที่สมบูรณ์ด้วยตัวคุณเอง เช่น. %{DOCUMENT_ROOT}%{REQUEST_URI}. ตัวอย่างเช่น:

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    
  • ใน โฮสต์เสมือน บริบท เส้นทาง URL ที่จับคู่โดย เขียนกฎใหม่ ลวดลาย เป็นญาติราก (เริ่มต้นด้วยเครื่องหมายทับ) ในขณะที่ .htaccess มันสัมพันธ์กับไดเร็กทอรีที่มีไฟล์ .htaccess ไฟล์ - น้อยกว่าคำนำหน้าเครื่องหมายทับ ดังนั้น กฎตามที่เขียนจะส่งผลให้มีเครื่องหมายทับสองครั้งที่จุดเริ่มต้นของเส้นทาง URL ควรเขียนใหม่ดังนี้:

    RewriteRule ^/(.*)$ /$1/ [R,L]
    

    (เดอะ เอ็น.ซี ไม่จำเป็นต้องตั้งค่าสถานะที่นี่)

    หรือ (ดีกว่า) อย่าใช้ backreference ที่นี่และใช้ REQUEST_URI ตัวแปรเซิร์ฟเวอร์แทน (ซึ่งจะทำงานใน .htaccess เช่นกัน). ตัวอย่างเช่น:

    RewriteRule ^ %{REQUEST_URI}/ [R,L]
    

    (นอกเหนือ: นี่น่าจะเป็นการเปลี่ยนเส้นทางถาวร 301 ด้วย (เช่น R=301). การดำเนินการนี้จะใช้ค่าเริ่มต้นเป็นการเปลี่ยนเส้นทางชั่วคราว 302 แต่ให้เปลี่ยนเป็น 301 เท่านั้น - หากนั่นคือความตั้งใจ - เมื่อคุณยืนยันว่าใช้งานได้ตามที่ตั้งใจไว้)

สรุปแล้วจะกลายเป็นว่า

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^/(.*)$ /$1/ [R,L]

นอกเหนือ:

ข้างต้นสามารถเพิ่มประสิทธิภาพได้ทันทีโดยการย้ายการตรวจสอบระบบไฟล์ (ซึ่งค่อนข้าง แพง) ไปยังเงื่อนไขสุดท้ายและย้าย เงื่อนไข ที่ตรวจสอบว่าคำขอไม่ได้ลงท้ายด้วยเครื่องหมายทับไปที่ เขียนกฎใหม่ คำสั่ง นอกจากนี้ รูปแบบย่อย regex (.*) ในแต่ละ เงื่อนไข ไม่จำเป็น ดังนั้นจึงสามารถเขียนใหม่ได้อย่างมีประสิทธิภาพมากขึ้น:

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/application-module/
RewriteCond %{REQUEST_URI} !json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/ [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule !/$ %{REQUEST_URI}/ [R,L]

การตรวจสอบระบบไฟล์อาจถูกลบออกทั้งหมด หากคุณยกเว้นคำขอที่มี (หน้าตา) นามสกุลไฟล์แทน แต่สิ่งนี้อาจขึ้นอยู่กับโครงสร้างไฟล์ของคุณ

เดอะ เงื่อนไข ที่ตรวจสอบ !json$ ดูเหมือนว่ามันควรจะตรวจสอบสำหรับ .json นามสกุลไฟล์เช่น . !\.json$. (สิ่งนี้เชื่อมโยงกับความคิดเห็นของฉันด้านบนเกี่ยวกับการยกเว้น ทั้งหมด คำขอที่มี "นามสกุลไฟล์".)

ครั้งแรก เงื่อนไข การตรวจสอบว่าสตริงข้อความค้นหาว่างเปล่านั้นดูแปลก ๆ เล็กน้อย (เนื่องจากไม่สำคัญว่าจะมีสตริงข้อความค้นหาหรือไม่เมื่อต่อท้ายเครื่องหมายทับในเส้นทาง URL) แต่ฉันคิดว่านี่ต้องเป็นข้อกำหนดเฉพาะหรือไม่

pl flag
นี่มันเจ๋งมาก! ทุกอย่างสมเหตุสมผลและตอนนี้ใช้งานได้แล้ว! ขอบคุณหลายครั้ง!

โพสต์คำตอบ

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