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


29

ฉันต้องตั้งค่า VirtualHost ของฉันบน Apache เพื่อให้บริการทั้ง http และ https (โดยใช้พอร์ตมาตรฐาน)

ถ้าฉันเปิดใช้งาน SSL Engine (ตามด้านล่าง) - ฉันได้รับข้อผิดพลาดเมื่ออยู่ที่พอร์ต 80

เหตุผลก็คือบางส่วนของไซต์จะต้องเป็น SSL แต่ส่วนอื่น ๆ ไม่จำเป็น ฉันจะให้บริการทั้ง http + https บนเว็บไซต์ได้อย่างไร

นี่คือไฟล์โฮสต์เสมือนของฉัน ....

NameVirtualHost *

<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName mysite.co.uk
        DocumentRoot /var/www/mysite/public
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysite/public>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

     #SSL STUFF...
      SSLEngine on
      SSLCertificateFile /etc/apache2/crts/mysite.crt
      SSLCertificateKeyFile /etc/apache2/crts/mysite.key
      SSLCertificateChainFile /etc/apache2/crts/DigiCertCA.crt


</VirtualHost>

คำตอบ:


44

คุณไม่สามารถทำสิ่งนี้ได้ในโฮสต์เสมือนหนึ่งเนื่องจาก Apache ต้องการรู้ว่าใครจะพูดคุย SSL และอันไหนที่ไม่ใช่ (sidenote: nginx ไม่มีปัญหานี้คุณสามารถบอกได้ว่าฟังคำสั่งใดที่เกี่ยวข้องกับ SSL; หนึ่งในหลายเหตุผลที่ฉันรักมัน)

วิธีที่ฉันจัดการสิ่งนี้ใน Apache คือการกำหนดค่าที่ไม่เกี่ยวข้องกับ SSL ทั้งหมดของฉันลงในไฟล์แยกต่างหากจากนั้นให้ vhost สองตัวกำหนดค่าติดกันซึ่งรวมถึงไฟล์กำหนดค่าเฉพาะไซต์ภายใน vhost stanza เช่นนี้ :

<VirtualHost 192.0.2.12:80>
    Include /etc/apache2/sites/example.com
</VirtualHost>

<VirtualHost 192.0.2.12:443>
    SSLEngine On
    # etc
    Include /etc/apache2/sites/example.com
</VirtualHost>

7

ดูเหมือนว่าปัญหาใน Apache vHost แต่ทำงานได้โดยไม่ต้องกำหนดค่าซ้ำ

SSLCertificateFile /srv/.ssl/self/server.crt
SSLCertificateKeyFile /srv/.ssl/self/server.pem

# REQUIRED
<VirtualHost *:80>
    DocumentRoot /srv/www/badhost
</VirtualHost>

<VirtualHost *:80 *:443>
    SSLEngine On
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /srv/www/example.www
</VirtualHost>

มันแปลกจริง ๆ แต่มีอยู่จริง!
user77376

1
สิ่งนี้ได้ผลเช่นเดียวกับที่คุณคาดหวังจากรถถัง - เกือบ แต่ไม่มาก! ฉันพบว่า Apache 2.4.10 ตั้งค่าตัวแปรสภาพแวดล้อม SERVER_PORT เป็น 443 แทนที่จะใช้พอร์ตที่คำขอมา (80 หรือ 443 ขึ้นอยู่กับ) <IMAGINARY_PARAGRAPH_BREAK> น่าเสียดายที่ฉันหวังว่าจะสามารถใช้สิ่งนี้ได้เพราะฉันต้องการเก็บไฟล์หนึ่งไฟล์ต่อโฮสต์เสมือน <IMAGINARY_PARAGRAPH_BREAK> นอกจากนี้คุณจะต้องมีคำสั่ง ServerName ภายใน <VirtualHost> ด้านบนมิฉะนั้นจะทำให้คำขอไม่ถูกต้อง ตั้งค่าเป็น ServerName badhost.bad หรืออะไรบางอย่าง
Daniel Beardsmore

1
@DanielBeardsmore: ผมได้ทดสอบเพียงแค่นี้กับ 2.4.18 จากคอลเลกชัน RH UseCanonicalPhysicalPort Offซอฟแวร์และที่ดูเหมือนว่าจะเกิดจากการเริ่มต้นของ หากคุณตั้งค่าเป็นเปิดคุณจะได้รับพอร์ตจริงที่ใช้ (สนุกพอฉันต้องออกไปSSLEngine Onใน vhost ที่ใช้เป็นทวีคูณของฉันและได้พอร์ต 80 เป็นค่าเริ่มต้น)
Ulrich Schwarz

1
@DanielBeardsmore: FWIW %{HTTPS}จะถูกตั้งค่าอย่างถูกต้องเช่นกัน แต่%{REQUEST_SCHEME}ไม่ได้ (เสมอhttp) ฉันรู้สึกโง่ที่ใส่คุณสมบัติคำขอสำหรับUseCanonicalRequestSchemeคำสั่งแม้ว่า
Ulrich Schwarz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.