2009-03-24 29 views
52

Tôi có một danh sách dài và phức tạp của các chỉ thị <VirtualHost> và tôi phải sao chép chúng thành các nhóm riêng biệt <VirtualHost> cho các cổng 80 và 443 vì tôi đang sử dụng SSL. Bất cứ khi nào tôi cập nhật các quy tắc mod_rewrite của tôi, tôi phải nhớ làm điều đó ở cả hai nơi hoặc nếu không tôi sẽ phá vỡ ứng dụng của tôi ... trùng lặp này là yêu cầu cho sự cố. Có một cách để kết hợp hoặc bí danh này - sự khác biệt duy nhất giữa hai là phiên bản cổng 443 chứa SSLEngine, SSLCertificateFile và muốn.Tôi có phải sao chép các chỉ thị Virtualhost cho cổng 80 và 443 không?

My <VirtualHost> chứa nhiều quy tắc mod_rewrite, quy tắc LocationMatch, chỉ thị CGI vv

Ngoài ra, tôi không thể sử dụng .htaccess file.

+1

Một bản sao của http://serverfault.com/questions/83669/apache2-with-ssl-do-i-have-to-copy-virtualhost-blocks –

Trả lời

43

Bạn không thể sử dụng chỉ thị bao gồm để bao gồm các quy tắc chung. here

article

Eg .:

<VirtualHost _default_:80> 
    ... 
    include conf/common_rule.conf 
</VirtualHost> 

<VirtualHost _default_:*> 
    ... 
    include conf/common_rule.conf 
</VirtualHost> 

<VirtualHost _default_:443> 
    ... #SSL rules 
    include conf/common_rule.conf 
</VirtualHost> 
+0

cảm ơn vì điều này; btw, [đây là phiên bản cập nhật] (http://httpd.apache.org/docs/2.4/mod/core.html#include) của chỉ thị apache 'include', là tài nguyên được liên kết đầu tiên trong câu trả lời của bạn –

+0

cảm ơn, tôi đã cập nhật nó ngay bây giờ. – sfossen

2

Bạn có thể đặt cấu hình chung thành một file riêng biệt và bao gồm nó trong cả hai phân đoạn VirtualHost. Ví dụ:

<VirtualHost 192.168.1.2:80> 
    Include conf/common.conf 
</VirtualHost> 

<VirtualHost 192.168.1.2:443> 
    Include conf/common.conf 
    (put your ssl specific cofiguration stuff here ...) 
</VirtualHost> 
0

Bạn cũng có thể chỉ định các chỉ thị chung trong một vùng chứa thay vì bên trong chính nó. Đó là những gì tôi làm, chủ yếu là vì tôi thích mod_rewrite quy tắc ở cấp thư mục thay vì ở cấp độ máy chủ, nhưng nó sẽ làm việc tốt như nhau cho bạn quá.

+3

Bạn đang thiếu một từ rất quan trọng. Bạn có thể thêm nó không? Và nếu bạn có thể đưa ra một ví dụ cũng sẽ hữu ích. – iconoclast

32

Bạn có thể sử dụng bất kỳ # máy chủ và cổng nào trong một chỉ thị Virtualhost duy nhất.

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> 

Trong trường hợp tôi đã sử dụng.

<VirtualHost *:80 *:443> 
    ServerName loop.lk 

.... 
SSLEngine on 
SSLCertificateFile /etc/apache2/ssl/local.crt 

</VirtualHost> 
+8

SSLEngine dường như được áp dụng ngay cả khi trang web được truy cập qua http, dẫn đến trang lỗi. –

+2

Nếu bạn có một khối '', tôi giả sử bạn có thể có một khối riêng biệt cho '' chỉ bao gồm các công cụ SSL. Đúng không? – iconoclast

+3

@iconoclast Không, bạn không thể có chỉ thị khác. Bạn có thể sử dụng \t .... OR \t ... –

7

Xin lỗi để bump lên một bài cũ như thế này, nhưng để giúp người dùng Google khác ngoài kia tôi muốn chia sẻ làm thế nào tôi dealed với nó:

Tôi có một vài vhosts trên localhost của tôi, nói: localhost, foo.com, bar.com

Đây là trang web cục bộ trên máy tính xách tay của tôi (macosx) Tôi có thể lấy chứng chỉ tự ký và do đó phần ssl là giống nhau đối với tất cả vhost. ..

Điều tôi đã làm là:

Tôi đã tạo thư mục /etc/apache2/extra/vhosts/.

Tôi tạo ra một /etc/apache2/extra/vhosts/localhost.conf:

ServerName localhost 
DocumentRoot "/www/localhost" 
<Directory /www/localhost> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/localhost.error_log" 
CustomLog "/var/log/apache2/localhost.access_log" common 

Một /etc/apache2/extra/vhosts/foo.conf:

ServerName foo.com 
DocumentRoot "/www/foo.com" 
<Directory /www/foo.com> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/foo.com.error_log" 
CustomLog "/var/log/apache2/foo.com.access_log" common 

Một /etc/apache2/extra/vhosts/bar.conf:

ServerName bar.com 
DocumentRoot "/www/bar.com" 
<Directory /www/bar.com> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/bar.com.error_log" 
CustomLog "/var/log/apache2/bar.com.access_log" common 

Và cuối cùng là một /etc/apache2/extra/vhosts/ssl.conf:

SSLEngine on 
SSLCertificateFile "/etc/apache2/ssl/server.crt" 
SSLCertificateKeyFile "/etc/apache2/ssl/server.key" 

Và trong tôi /etc/apache2/extra/httpd-vhosts.conf:

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/localhost.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/localhost.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/foo.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/foo.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/bar.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/bar.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 
+0

Cũng đi với giải pháp này. Hoạt động tuyệt vời –

Các vấn đề liên quan