ฉันสามารถกำหนด HTTP และ HTTPS ใน VirtualHost เดียวกันใน Apache conf ได้หรือไม่


13

ฉันมีคำนิยาม VirtualHost ที่ค่อนข้างใหญ่ซึ่งฉันไม่ต้องการทำซ้ำดังนั้นไซต์จะทำงานผ่าน HTTPS

นี่คือสิ่งที่ฉันต้องการจะทำ:

<VirtualHost *>
    ServerName example.com

    <If port=443>
        SSLEngine on
        SSLCertificateFile ...
        SSLCertificateKeyFile ...
        SSLCertificateChainFile ...
    </If>

    (other config)

</VirtualHost>

มีวิธีการทำเช่นนี้?
ฉันไม่มีวิธีอื่นที่จะไม่ทำการตั้งค่าซ้ำหรือไม่

คำตอบ:


12

รุ่นที่มีเสถียรภาพในปัจจุบันของ Apache (2.2) ไม่ได้มีคุณลักษณะที่ แต่ 2.4 จะมีคำสั่ง IF

ตอนนี้คุณต้องสร้าง VirtualHosts สองตัว แต่คุณสามารถตั้งค่าบางอย่างผ่านสภาวะแวดล้อมหรือตัวแปรกลางของ apache และใช้ใน virtualhost config ของคุณ (การตั้งค่า documentroot เป็นต้น) วิธีนี้ถ้าคุณต้องการเปลี่ยนที่คุณสามารถทำได้ด้วยการแก้ไขเพียงบรรทัดเดียว

แน่นอนคุณสามารถใช้รวมเพื่อทำสิ่งนี้:

<VirtualHost *:80>
        include /etc/apache2/vhost.conf.d/site1
</VirtualHost>

<VirtualHost *:443>
        include /etc/apache2/vhost.conf.d/site1
        include /etc/apache2/vhost.conf.d/site1-ssl
</VirtualHost>

ps: SNI จะเป็นปีสำคัญก่อนการปรับ IPv6 เบราว์เซอร์กระแสหลักทั้งหมดสนับสนุนแล้วโดยถือว่าคุณอยู่ในระบบปฏิบัติการที่รองรับ

แก้ไข: ตามที่ fooquency เห็นคุณไม่สามารถใส่ SSLEngine บนไปยังบล็อก If ดังนั้นคำตอบของฉันผิด


8
ความพยายามที่จะใส่SSLEngine Onใน<If>จะให้SSLEngine not allowed hereดังนั้นแนะนำให้ใช้กรณีที่จุดเริ่มต้นของคำตอบนี้เศร้าไม่ปรากฏจะเป็นไปได้ สิ่งนี้น่าจะเป็นเพราะข้อกำหนดที่ว่า "สามารถใช้ได้เฉพาะคำสั่งที่สนับสนุนบริบทไดเรกทอรีในส่วนการกำหนดค่านี้" (อ้างอิง)และSSLEngineคือserver config, virtual host (อ้างอิง)ไม่ใช่ไดเรกทอรี
fooquency

3

ไม่คุณสามารถย้ายสิ่งต่าง ๆ ส่วนใหญ่ไปยังการกำหนดค่าส่วนกลางและสืบทอดใน VirtualHost


1
น่าเสียดายที่ฉันมี VirtualHost สองสามตัวแต่ละตัวมีการกำหนดค่าที่แตกต่างกันและส่วนใหญ่ต้องการทำงานผ่าน HTTP และ HTTPS
Jake

1
คำตอบนี้ไม่เป็นประโยชน์เพียงคำตอบเดียวเท่านั้น โปรดย้ายไปที่เว็บเซิร์ฟเวอร์ที่ไม่ได้ดูด :)
intgr

3

นี่คือคำตอบในคำถามอื่น ใช้คำสั่งรวม ทำงานเหมือนเสน่ห์สำหรับฉัน:

แสดง http (พอร์ต 80) และ https (พอร์ต 443) บน VirtualHost เดียวกัน

# Acme Co
<VirtualHost 192.168.56.101:80>
        Include /usr/local/apache2/conf/main-acme.conf
</VirtualHost>

###* SSL
<VirtualHost 192.168.56.101:443>
        Include /usr/local/apache2/conf/main-acme.conf
        SSLEngine On
</VirtualHost>

2

สำหรับโฮสต์เสมือน SSL คุณต้องใช้พอร์ตที่สอง ala

<VirtualHost *:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost *:4443>
    Servername def.com
</VirtualHost>

หรือคุณต้องใช้ IP แยกต่างหาก

<VirtualHost 192.168.0.1:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost 192.168.0.2:443>
    Servername def.com
</VirtualHost>

มีคำอธิบายที่ดีมากในเอกสาร Apache SSL ที่http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html Apache

ค้นหาคำว่า "ทำไมฉันไม่สามารถใช้ SSL กับโฮสต์เสมือนที่ใช้ชื่อ / ไม่ใช่ IP ได้"


2
โปรดระวังสิ่งนี้ในอนาคตแม้ว่า: en.wikipedia.org/wiki/Server_Name_Indication
mattdm

กระแทกแดกดันตามเวลาที่ได้รับการยอมรับอย่างกว้างขวางเพียงพอที่จะใช้อย่างปลอดภัยสำหรับเว็บไซต์โฮสต์เสมือนส่วนใหญ่ IPv6 อาจเป็นเรื่องธรรมดาพอที่จะทำให้มันไม่เกี่ยวข้อง
jgoldschrafe

4
@jgoldschrafe สวัสดีปี 2010 เป็นอนาคตที่พูดที่นี่! caniuseล่าสุดแสดงให้เห็นว่าเบราว์เซอร์ที่ไม่ใช่ SNI นั้น <2% ทั่วโลก จากโลกแรกมันอาจจะน้อยกว่านี้มาก IPv4 ยังมีชีวิตอยู่และดี :)
kubanczyk

2
@kubanczyk มีฉันแล้ว! :)
jgoldschrafe

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