จำกัด Apache ให้อนุญาตการเข้าถึงโดยใช้ SSL สำหรับบางไดเรกทอรีเท่านั้น


34

ฉันมีเซิร์ฟเวอร์ Apache 2.2 ที่มีใบรับรอง SSL ซึ่งโฮสต์บริการต่าง ๆ ที่ควรเข้าถึงโดยใช้ SSL เท่านั้น

เช่น: https : //myserver.com/topsecret/ ควรได้รับอนุญาตในขณะที่http : //myserver.com/topsecret/ ควรถูกปฏิเสธหรือเปลี่ยนเส้นทางไปที่ https http://myserver.com/publicไม่ควรมีข้อ จำกัด นี้และควรทำงานโดยใช้ http หรือ https
การตัดสินใจอนุญาต / ปฏิเสธ http นั้นทำที่ไดเรกทอรีระดับบนสุดและมีผลกับเนื้อหาทั้งหมดที่อยู่ด้านล่าง

มีคำสั่งที่สามารถวางในการกำหนดค่า Apache เพื่อ จำกัด การเข้าถึงในลักษณะนี้หรือไม่?

คำตอบ:


38

SSLRequireSSLสั่งคือสิ่งที่คุณกำลังมองหา

ภายในของคุณ<VirtualHost>หรือที่ระดับสูงสุดหากคุณไม่ได้ใช้โฮสต์เสมือน:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

หรือใน.htaccess:

SSLRequireSSL

1
ยินดีต้อนรับสู่ Server Fault! เราชอบที่คำตอบนั้นมีเนื้อหาไม่ใช่ตัวชี้ไปที่เนื้อหา ในทางทฤษฎีอาจตอบคำถามอย่างไรก็ตามมันจะดีกว่าถ้าจะรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง ขอขอบคุณ!
Chris S

8
ตกลงฉันได้อัปเดตโพสต์อายุห้าขวบของฉันด้วยตัวอย่าง :)
Thomas

1
เพื่อความเป็นธรรมอายุ 5 ปีหรือไม่เหตุผลก็คือลิงก์ที่คุณชี้ไปอาจหายไปทำให้คำตอบของคุณส่วนใหญ่หรือไร้ประโยชน์อย่างสมบูรณ์กับคนที่เข้ามาหาข้อมูลในภายหลัง ดังนั้นฉันจึงโหวตให้คุณแสดงความคิดเห็นอย่างรุนแรง (ซื่อสัตย์) แต่ฉันก็เห็นด้วยอย่างยิ่งว่าคำตอบควรมีบริบทเพื่อให้มีประโยชน์ โดยเฉพาะอย่างยิ่งเนื่องจากมีการทำเครื่องหมายเป็นคำตอบที่ถูกต้อง
Craig

ฉันไม่คิดว่าชุมชน SO / SF นั้นเข้มงวดเกี่ยวกับ just-a-link และคำตอบ "lmgtfy" ในตอนนั้น แต่ฉันเห็นด้วย; การแก้ไขย้อนหลังทำให้รู้สึกได้ตลอดเวลา
โทมัส

ไฟล์การกำหนดค่าใดที่ฉันจะเพิ่มคำสั่งคำสั่งนั้น?
แดนคาร์เตอร์

8

ในการกำหนดค่าส่วนกลางคุณสามารถใช้:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

ในทำนองเดียวกันคุณสามารถใช้ไฟล์. htaccess ในไดเรกทอรีแรกของแผนผังไดเรกทอรีที่ปลอดภัย:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

สุดท้ายนั้นสามารถอยู่ในไดเรคทอรีไดเรกทีฟในส่วนกลางหรือโฮสต์เสมือน


การเปลี่ยนเส้นทาง HTTP ไปยัง HTTPS จะเปิดการโจมตี MiTM บางประเภท เพียงแค่ความระมัดระวัง
Craig

1

หรือคุณสามารถใช้ภาษาฝั่งเซิร์ฟเวอร์เพื่อทำการประมวลผลแทนการใช้ตัวเลือกการกำหนดค่าของ Apache (บางทีคุณอาจไม่มีสิทธิ์เข้าถึงการกำหนดค่าเซิร์ฟเวอร์)

ตัวอย่างเช่นด้วย PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

(แม้ว่าเพิ่งทราบ - ถ้าคุณใช้ ISAPI บน Microsoft IIS, ถ้าคำขอไม่ถูกส่งผ่าน HTTPS ค่าของตัวแปร $ _SERVER ['HTTPS'] จะเป็น "ปิด")


1

มีคนพูดถึง SSLRequireSSL แต่ฉันไม่คิดว่ามันจะทำงานได้ด้วยตัวเองและฉันไม่พบตัวอย่างที่ประสบความสำเร็จ วิธีที่แนะนำคือhttps://wiki.apache.org/httpd/RedirectSSLฉันสมัครแล้วและใช้งานได้ดี!


0

สมมติว่าคุณกำลังใช้คำสั่ง VirtualHost

วางไดเรกตอรีไดเรกทีฟใน non-ssl virtualhost ปฏิเสธการเข้าถึง

จากนั้นวางคำสั่ง Directory ใน ssl virtualhost ที่ให้สิทธิ์การเข้าถึง


0

ฉันได้ทำ mod_rewrite นี้เสมอในไฟล์. htaccess ถึงแม้ว่าคุณจะสามารถทำได้ภายในไฟล์ config หลักของคุณเช่นกัน

ต่อไปนี้เป็นคำแนะนำเกี่ยวกับวิธีการทำให้สิ่งนี้เกิดขึ้น: Smart HTTP และ HTTPS RewriteRule Redirects Redirect

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