我无法让 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/...
例如:
- 首先我进入http://home.myhome.net:4388/pageA我被重定向到https://home.myhome.net:4389/pageA
- 我下次再进来http://home.myhome.net:4388/pageB并重定向到 https://home.myhome.net:4388/页B
有什么想法可以解决这个问题吗?
我的操作系统详细信息:
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 协议的原因。
给出的例子都是有效的。