ฉันจะใช้คำสั่ง <If> ใน. htaccess ได้อย่างไร


16

ฉันกำลังพยายามเพิ่มคำสั่งแบบมีเงื่อนไขโดยใช้คำสั่ง If ของ Apache ในไฟล์. htaccess ของฉัน

ฉันได้อ้างอิงหน้านี้http://httpd.apache.org/docs/trunk/mod/core.html#ifแต่ไม่ได้อธิบายรายละเอียดมากนัก / ยกตัวอย่างมากมาย ตัวอย่างที่ไม่สมบูรณ์สองตัวอย่างที่ให้คือ:

<ถ้า% {REQUEST_METHOD} เป็น GET, HEAD, OPTIONS> 

และ

<ถ้า "$ req {Host} = ''"> 

ดังนั้นฉันจึงพยายามเพิ่มสิ่งนี้ลงในไฟล์. htaccess ของฉัน:

<ถ้า% {SERVER_PORT} เป็น GET, HEAD, OPTIONS>
   # ไม่มีที่นี่เลย
</ ถ้า>

แต่ฉันได้รับข้อผิดพลาด 500 อย่างต่อเนื่องเมื่อฉันพยายามโหลดหน้าเว็บ นี่คือการติดตั้งในเครื่องของฉันและมันก็ใช้ได้ดีก่อนหน้านี้ (หรือถ้าฉันลบรหัสนั้น) ฉันเชื่อว่าฉันได้AllowOverride Allตั้งค่าทั่วโลกและบริบทสำหรับหากคำสั่งควรให้มันอยู่ใน. htaccess ("บริบท: การกำหนดค่าเซิร์ฟเวอร์, โฮสต์เสมือน, ไดเรกทอรี,. htaccess")

บางคนสามารถให้ตัวอย่างฉันถึงวิธีการใช้คำสั่ง <If> อย่างถูกต้องหรือแนวทางบางอย่างว่าทำไมมันไม่ทำงานสำหรับฉัน

ขอบคุณ!


1
หากคุณได้รับข้อผิดพลาด 500 นั่นหมายความว่า Apache ได้บันทึกบางสิ่งลงในบันทึกข้อผิดพลาดของคุณ มันพูดว่าอะไร? นอกจากนี้การทดสอบของคุณสำหรับSERVER_PORTin GET,HEAD,OPTIONSไม่สมเหตุสมผล ( SERVER_PORTจะเป็นหมายเลขพอร์ตหมายเลขที่ได้รับการร้องขอ)
larsks

ขอบคุณ larsks ดูเหมือนว่าฉันกำลังเรียกใช้ apache 2.0 ซึ่งไม่รองรับคำสั่ง <If> บางทีฉันอาจต้องดูการอัพเกรดเป็น 2.3 อย่างน้อยนี่อธิบายว่าทำไมไม่มีตัวอย่างเลย (b / c คุณลักษณะนี้ใหม่) ขอบคุณสำหรับคำแนะนำ.
cwd

คำตอบ:



16

<If> มีเฉพาะใน Apache 2.4+ ดังนั้นก่อนอื่นต้องแน่ใจว่าคุณมีเวอร์ชันนั้น

ตัวอย่าง

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

ทางเลือกในการ <If>

มีวิธีแก้ไขปัญหาอื่น ๆ สองสามข้อสำหรับการทำคำสั่งแบบมีเงื่อนไขใน Apache 2.2 หากคุณยังติดอยู่กับที่

  • คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมผ่าน:

    • การกำหนดค่า Apache
    • SetEnvIf
    • ของ mod_rewrite RewriteMatch
  • จากนั้นคุณสามารถดำเนินการตามเงื่อนไขโดยใช้

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

ตัวอย่าง:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX

1
ทดสอบ แต่ไม่ทำงาน! ในเอกสารจาก Apache <IfDefine>คำสั่งแยกวิเคราะห์เฉพาะเมื่อเริ่มต้นและparameter-nameเป็นเพียงสามารถผ่านโดยการใช้คำสั่ง promphttpd -Dx=y
William Leung

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