Phục vụ http (cổng 80) và https (cổng 443) trên cùng Virtualhost


29

Tôi cần thiết lập Virtualhost của mình trên Apache để phục vụ trên cả http và https (sử dụng các cổng tiêu chuẩn)

Nếu tôi bật Công cụ SSL (theo bên dưới) - Tôi gặp lỗi khi ở cổng 80.

Lý do là, các phần của trang web cần phải là SSL nhưng các phần khác thì không. Làm cách nào tôi có thể phục vụ cả http + https trên trang web?

Đây là tập tin máy chủ ảo của tôi ....

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>

Câu trả lời:


44

Bạn không thể làm điều này trong một máy chủ ảo, bởi vì Apache cần biết ai sẽ nói về SSL và cái nào không (sidenote: nginx không có vấn đề này, bạn có thể nói với nó rằng các chỉ thị lắng nghe liên quan đến SSL; một trong nhiều lý do tôi thích nó)

Cách tôi quản lý điều này trong Apache là đặt tất cả cấu hình không liên quan đến SSL của tôi vào một tệp riêng biệt và sau đó có hai vhost được cấu hình cạnh nhau, bao gồm cả tệp cấu hình dành riêng cho trang web bên trong khổ thơ vhost, như thế này :

<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

Nó có vẻ như là một vấn đề trong Apache vhost, nhưng nó thực hiện công việc mà không phải lặp lại cấu hình.

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>

Điều đó thực sự kỳ lạ, nhưng tồn tại!
dùng77376

1
Điều này hoạt động tốt như bạn có thể mong đợi từ một loại bùn như vậy - gần như, nhưng không hoàn toàn! Tôi thấy rằng Apache 2.4.10 đặt biến môi trường SERVER_PORT thành 443 thay vì sử dụng cổng mà yêu cầu xuất hiện (tùy thuộc vào 80 hoặc 443). <IMAGINARY_PARAGRAPH_BREAK> Đáng tiếc, vì tôi đã hy vọng có thể sử dụng điều này, vì tôi thực sự muốn giữ một tệp cho mỗi máy chủ ảo. <IMAGINARY_PARAGRAPH_BREAK> Ngoài ra, bạn sẽ cần một lệnh ServerName bên trong <Virtualhost> hàng đầu nếu không nó sẽ ngấu nghiến các yêu cầu do nhầm lẫn. Đặt nó thành ServerName badhost.bad hoặc một cái gì đó.
Daniel Beardsmore

1
@DanielBeardsmore: Tôi vừa thử nghiệm điều này với 2.4,18 từ các bộ sưu tập Phần mềm RH và dường như đó là do mặc định của UseCanonicalPhysicalPort Off. Nếu bạn đặt thành bật, dường như bạn sẽ sử dụng cổng thực tế. (Thật thú vị, tôi đã phải rời khỏi SSLEngine Onvhost được sử dụng gấp đôi của mình và lấy cổng 80 làm mặc định.)
Ulrich Schwarz

1
@DanielBeardsmore: FWIW, %{HTTPS}cũng sẽ được đặt chính xác, nhưng %{REQUEST_SCHEME}không (luôn luôn http). Tuy nhiên, tôi cảm thấy ngớ ngẩn khi đưa ra một yêu cầu tính năng cho một UseCanonicalRequestSchemechỉ thị.
Ulrich Schwarz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.