无法在HTTPS

时间:2017-10-06 16:04:00

标签: apache .htaccess redirect mod-rewrite https

我正在尝试将我网站中的所有传入请求重定向到:https://www.example.com

我可以使用和不使用www来重定向HTTP流量,但我无法使用非www HTTPS请求。我的意思是:

  • http://example.com - >重定向正确
  • http://www.example.com - >重定向正确
  • https://example.com - >没有重定向

我在我的.htaccess文件中尝试了很多规则,但它们似乎都没有用。

我在CentOS机器上使用Apache / 2.2.15。我还使用mod_jk模块将所有流量重定向到Tomcat。

我的配置文件如下所示:

mod_jk.conf

LoadModule jk_module "/etc/httpd/modules/mod_jk.so"
JkWorkersFile /etc/httpd/conf/workers.properties
JkShmFile     /var/run/httpd/mod_jk.shm
JkLogFile     /var/log/httpd/mod_jk.log
JkLogLevel    info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

workers.properties

workers.apache_log=/var/log/httpd
worker.list=app1Worker
worker.app1Worker.type=ajp13
worker.app1Worker.host=localhost
worker.app1Worker.port=8009

app1.conf

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
    CustomLog /var/log/httpd/app1_access.log combined
    ErrorLog /var/log/httpd/app1_error.log

    #<IfModule mod_jk.c>
       JkMount /* app1Worker
    #</IfModule>

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

listening.conf

Listen 217.61.129.109:80
Listen 217.61.129.109:443

的.htaccess

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,NE,R=301]

我在.htaccess文件中尝试了很多其他规则,但没有一个规则有效。

你能说出最后一个案例不起作用的原因吗?

UPDATE-1

对于误解而感到抱歉,但我只包含了括号,因为否则StackOverflow会抱怨。只是忽略它们。 (现已删除)

AllowOverride的配置位于Apache的主httpd.conf文件中:

DocumentRoot "/var/www/html"
<Directory />
    Options SymLinksIfOwnerMatch
    AllowOverride All
</Directory>

<Directory "/var/www/html">
    Options Indexes SymLinksIfOwnerMatch
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

我将AllowOverride None更改为AllowOverride All,因为在开始时这就是原因,.htaccess文件根本没有处理过。

现在我已经测试过正在处理这个文件,因为如果我评论它的所有内容,那么HTTP重定向就不起作用了。我的问题只在于非www HTTPS重定向。

我的感觉是.htaccess中的规则是正确的,但我必须缺少其他的东西。

UPDATE-2已解决!!!

请看下面的答案

1 个答案:

答案 0 :(得分:2)

<强>解决!!!

嗯,我现在不知道为什么.htaccess过滤器对于提到的特殊情况不起作用,但根据@MrWhite的建议,我可以使用<VirtualHost>配置。

我更新了我的listen.conf文件:

NameVirtualHost *:80
Listen 80
NameVirtualHost *:443
Listen 443

我的app1.conf就像这样:

<VirtualHost *:80>
   ServerName www.example.com
   ServerAlias example.com
   Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
   ServerName example.com
   Redirect permanent / https://www.example.com/
   SSLEngine on
   SSLCertificateFile    /etc/letsencrypt/live/example.com/cert.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
   SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
    CustomLog /var/log/httpd/app1_access.log combined
    ErrorLog /var/log/httpd/app1_error.log
    #Redirect all traffic to Tomcat
    JkMount /* app1Worker
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

感谢您的帮助。