在mod_jk之前重写Apache(删除www)

时间:2017-01-15 18:22:44

标签: apache redirect ssl mod-rewrite mod-jk

以下是上下文:

  • 我正在使用Centos 7,apache 2.4.6和tomcat 8.0。
  • 我有一个经典的php网站,存储在/ var / www文件夹中。
  • 我有一个存储在tomcat webapps文件夹中的JEE网站。
  • 我有一张通配符ssl证书(已签名)。

这就是我想要的:

  • 我希望我的服务器的所有访问都被重定向到正确的网站,使用https,而不是www。

以下是用例:

  • 网址'example.com'==>重定向到https确定
  • 网址'www.example.com'==>重定向https +删除www确定
  • 网址“https://www.example.com”==>保持https +删除www确定

  • 网址'test.example.com'==>重定向到https确定

  • 网址'www.test.example.com'==>重定向https +删除www确定
  • 网址'https://www.test.example.com'==> KO没有重定向 - 浏览器显示一个页面,说明网站配置错误,连接不安全(因为通配符ssl不包括2个级别)

最后一点是我正在努力解决的问题。

这是我的配置:

    <VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        Redirect / https://example.com/
    </VirtualHost>
    <VirtualHost *:80>
        ServerName test.example.com
        ServerAlias www.test.example.com
        Redirect / https://test.example.com/
    </VirtualHost>
    <VirtualHost *:443>
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot /var/www/public/example
        SSLEngine on
        SSLCertificateFile xxx
        SSLCertificateKeyFile xxx
        SSLCertificateChainFile xxx
        RewriteEngine On
        RewriteCond %{HTTPS} off [OR]
        RewriteCond %{HTTP_HOST} ^www\. [NC]
        RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
        RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
    </VirtualHost>
    <VirtualHost *:443>
        ServerName test.example.com
        ServerAlias www.test.example.com
        SSLEngine on
        SSLCertificateFile xxx
        SSLCertificateKeyFile xxx
        SSLCertificateChainFile xxx
        RewriteEngine On
        RewriteCond %{HTTPS} off [OR]
        RewriteCond %{HTTP_HOST} ^www\. [NC]
        RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
        RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
        JkMount / worker_test
        JkMount /* worker_test
    </VirtualHost>

所以,似乎我差不多了,但我做错了什么?

1 个答案:

答案 0 :(得分:0)

据我所知,您无法为每个IP配置多个https虚拟主机,就是这样,基于名称的虚拟主机仅限于一个SSL虚拟主机。

此信息来自https://wiki.apache.org/httpd/NameBasedSSLVHosts

  

通常,在同一IP地址和端口上托管多个SSL虚拟主机是不可能的。这是因为Apache需要知道主机的名称才能选择正确的证书来设置加密层。但是,所请求主机的名称仅包含在HTTP请求标头中,该标头是加密内容的一部分。因此,在加密已经协商之后才可用。这意味着无法选择正确的证书,客户端将收到证书不匹配警告,并且容易受到中间人攻击。

     

实际上,Apache将允许您配置基于名称的SSL虚拟主机,但它将始终使用首先列出的虚拟主机(在所选IP地址和端口上)的配置来设置加密层。在某些特定情况下,可以为多个虚拟主机使用单个SSL配置。特别是,如果SSL证书适用于所有虚拟主机,则此功能将起作用。例如,这将在以下情况下有效:

     
      
  1. 所有VirtualHost都在同一个域内,例如:one.example.com和two.example.com。

  2.   
  3. 您拥有该域的通配符SSL证书(通用名称以星号开头的证书:即* .example.com)

  4.   

我听说过使用SNI实现这种配置,但我从未测试过:SSL with Virtual Hosts Using SNI