mod_rewrite 从 http 端口 XXXX 到 https 端口 XXXY

mod_rewrite 从 http 端口 XXXX 到 https 端口 XXXY

我无法让 mod_rewrite 按照以下规则工作。

RewriteCond "%{SERVER_NAME}" "home.myhome.net"
RewriteCond "%{SERVER_PORT}" "^4388$"
RewriteRule (.*) https://home.myhome.net:4389%{REQUEST_URI} [QSA,R=301,L]

此规则设置在我的 http 虚拟主机部分。问题是,重定向仅在第一次有效。第二次,当我在 http 端口 4388 上输入不同的 URL 时,我被重定向到https://home.myhome.net:4388/...

例如:

有什么想法可以解决这个问题吗?

我的操作系统详细信息:

root@host:~# dpkg -l|grep apache
ii  apache2                                     2.4.18-2ubuntu3.5                            amd64        Apache HTTP Server
ii  apache2-bin                                 2.4.18-2ubuntu3.5                            amd64        Apache HTTP Server (modules and other binary files)
ii  apache2-data                                2.4.18-2ubuntu3.5                            all          Apache HTTP Server (common files)
ii  apache2-utils                               2.4.18-2ubuntu3.5                            amd64        Apache HTTP Server (utility programs for web servers)
ii  python-certbot-apache                       0.17.0-1+ubuntu16.04.1+certbot+1             all          Apache plugin for Certbot
root@host:~# lsb_release -d
Description:    Ubuntu 16.04.3 LTS

这是我的虚拟主机配置,它有所不同,因为我做了更多测试,但行为相同。我还放弃了测试所有其他重写规则,结果相同(以及我在评论中所说的,对于每个测试,我都会刷新浏览器缓存)。

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond "%{SERVER_NAME}" "home.myhome.net"
        RewriteCond "%{SERVER_PORT}" "^4388$"
        RewriteRule ^ https://%{SERVER_NAME}:4389%{REQUEST_URI} [noescape,qsappend,redirect=301,last]
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

哦,我忘了说,该服务器位于 NAT 网关后面,它将端口从外部端口 4388 转发到内部主机端口 80,还将外部端口 4389 转发到内部端口 443。这就是为什么我需要检查端口和主机名以仅匹配外部流量。

编辑:好的,我发现了一些东西,但还没有解决方案:我将第一个和接下来的浏览器请求/响应与浏览器开发人员工具->网络选项卡进行了比较:

第一个请求给我“301 永久移动“,但以下请求给了我一个“307 内部重定向“。

所以这似乎是服务器的问题。问题只是,这是否是 mod_rewrite 中的错误,或者是我的错,因为规则不合适。

编辑:我现在还测试了当前的 apache 版本 2.4.27-5.1+ubuntu16.04.1+deb.sury.org+1Ondřej Surý 的 Apache PPA

问候,托马斯

答案1

好吧,经过长时间的搜索,我终于找到了原因。我已经在 https 网站上设置了 HTTP 严格传输安全 (HSTS),这就是为什么浏览器不会重新启动以在该 URL 上打开 http 网站并强制使用 https 协议的原因。

给出的例子都是有效的。

相关内容