Apache 无法在HTTPS中强制使用www URL

Apache 无法在HTTPS中强制使用www URL,apache,.htaccess,redirect,mod-rewrite,https,Apache,.htaccess,Redirect,Mod Rewrite,Https,我正在尝试将站点中的所有传入请求重定向到:https://www.example.com 我能够重定向HTTP流量,无论是否使用www,但我无法让它处理非www HTTPS请求。我的意思是: http://example.com->正确重定向 http://www.example.com->正确重定向 https://example.com->不重定向 我在.htaccess文件中尝试了许多规则,但似乎没有一条有效 我正在CentOS机器上使用Apache/2.2.15。我还使用mod_jk

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

我能够重定向HTTP流量,无论是否使用www,但我无法让它处理非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] "
<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>
Listen 217.61.129.109:80
Listen 217.61.129.109:443
工人。财产

workers.apache_log=/var/log/httpd
worker.list=app1Worker
worker.app1Worker.type=ajp13
worker.app1Worker.host=localhost
worker.app1Worker.port=8009
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,NE,R=301]
app1.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] "
<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>
Listen 217.61.129.109:80
Listen 217.61.129.109:443
.htaccess

workers.apache_log=/var/log/httpd
worker.list=app1Worker
worker.app1Worker.type=ajp13
worker.app1Worker.host=localhost
worker.app1Worker.port=8009
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,NE,R=301]
我在
.htaccess
文件中尝试了许多其他规则,但都不起作用

你能告诉我最后一个案子不起作用的原因吗

更新-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>
DocumentRoot”/var/www/html
选项SYMBOLINKSIFOWNERMATCH
允许超越所有
选项索引SYMBLINKSIFOwnerMatch
允许超越所有
命令允许,拒绝
通融
我通过
AllowOverride All
更改了
AllowOverride None
,因为一开始这就是原因,
.htaccess
文件根本没有被处理

现在我已经测试了这个文件是否正在被处理,因为如果我对它的所有内容进行注释,那么HTTP重定向就不起作用。我的问题只是非www HTTPS重定向

我的感觉是
.htaccess
中的规则是正确的,但我肯定还遗漏了一些东西

更新-2已解决


请在下面查找答案

已解决

我现在不知道为什么。htaccess过滤器在提到的特殊情况下不起作用,但根据@MrWhite的建议,我让它与
配置一起工作

我更新了listening.conf文件,如下所示:

NameVirtualHost *:80
Listen 80
NameVirtualHost *:443
Listen 443
<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>
我的app1.conf如下所示:

NameVirtualHost *:80
Listen 80
NameVirtualHost *:443
Listen 443
<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>

服务器名www.example.com
ServerAlias example.com
重定向永久/https://www.example.com/
ServerName example.com
重定向永久/https://www.example.com/
斯伦金安
SSLCertificateFile/etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile/etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile/etc/letsencrypt/live/example.com/chain.pem
服务器名www.example.com
日志格式“%h%l%u%t\%r\”%>s%b\“%%{Referer}i\\\“%%{User agent}i\\”组合
CustomLog/var/log/httpd/app1\u access.log组合
ErrorLog/var/log/httpd/app1\u error.log
#将所有流量重定向到Tomcat
JkMount/*app1Worker
斯伦金安
SSLCertificateFile/etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile/etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile/etc/letsencrypt/live/example.com/chain.pem

谢谢您的帮助。

您在哪里启用https配置中的
.htaccess
?(即
AllowOverride
指令)。由于协议周围的括号将可怕地破坏此重定向,我怀疑它根本没有被执行。但是,由于您可以访问服务器配置,因此应该在那里执行此重定向,而不是
.htaccess
。然后,端口80的VirtualHost将有一个简单的
重定向。仅为您的规范主机创建一个单独的VirtualHost,并
重定向到它。和往常一样,请清除浏览器缓存。我已经更新了我的帖子,请检查。我曾尝试在VirtualHost上进行重定向,它可以将http流量从端口80重定向到https。但是我怎样才能强制那里有www来获取https URL呢?你应该添加你的“UPDATE-2”作为答案并接受它(我会投票给它的!)。谢谢你的帮助。非常感谢你回来发布你的解决方案。这起了很大的作用+1.