อะไรคือสิ่งที่เทียบเท่ากับ Apache ของ try_files ของ Nginx?


12

ใน Nginx มีtry_filesคำสั่ง config ที่ "ตรวจสอบการมีอยู่ของไฟล์ตามลำดับและส่งคืนไฟล์แรกที่พบ" ฉันคิดว่ามันเรียบร้อยมากในการทำเช่นนี้

location ~* \.(gif|jpe?g|css|js)$ {
    try_files $uri 404;
}

ซึ่งเป็นวิธีที่ปลอดภัยในการให้บริการไฟล์คงที่โดยตรงโดยไม่รบกวนกรอบเว็บ ฉันจะทำสิ่งเดียวกันใน Apache ได้อย่างไร


1
อะไรคือทางออกของคุณ? คำตอบที่เลือกไม่ตรงกับกรณีการใช้งานของฉัน
panepeter

คำตอบ:


9

ฉันมักจะเห็นสิ่งนี้ทำกับ mod_rewrite:

 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
 RewriteRule ^/(.*)$ balancer://app_cluster%{REQUEST_URI} [P,QSA,L]

หมายความว่า "หากไฟล์ไม่มีอยู่ในระบบไฟล์ให้ใช้พรอกซีผ่านคลัสเตอร์ mod_proxy_balancer ของฉัน" มิฉะนั้นหากไฟล์นั้นมีอยู่ในระบบไฟล์มันก็จะให้บริการโดย Apache สัมพันธ์กับที่กำหนดไว้DocumentRootใน virtualhost ของคุณ

แต่นั่นไม่ใช่วิธีที่ฉันชอบส่วนใหญ่เพราะมันจะต้องมีการstatเรียกระบบต่อคำขอ

ด้วย mod_proxy คุณสามารถใช้ProxyPassMatchถ้าคุณมี Apache รุ่นใหม่เพียงพอ ( ดูเอกสารประกอบ ) เช่น:

ProxyPassMatch \.(gif|jpe?g|css|js)$ !

ซึ่งใช้! เพื่อระบุว่า Apache ไม่ควรร้องขอพรอกซีที่ตรงกับนิพจน์ทั่วไปนั้น

หากคุณใช้ Apache รุ่นเก่ากว่าคุณจะมีProxyPassคำสั่งให้คุณ แต่ตรงกับคำนำหน้า URI เท่านั้น (นี่เป็นวิธีที่ฉันต้องการในปัจจุบัน):

ProxyPass /images !
ProxyPass /stylesheets !

แน่นอนถ้าคุณต้องทำตรงกับการแสดงออกปกติที่คุณกล่าวถึงข้างต้นแล้วคุณก็สามารถปรับเปลี่ยนกฎ mod_rewrite %{REQUEST_URI}ผมโพสต์ที่ด้านบนเพื่อลบล้างการแข่งขันกับ

หวังว่าจะช่วย!


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