我无法使用以下规则使 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:438 8 /...
例如:
- 首先我输入http://home.myhome.net:4388/pageA我被重定向到https://home.myhome.net:4389/pageA
- 下次我输入http://home.myhome.net:4388/pageB并被重定向到 http s ://home.myhome.net:438 8 /pageB
任何想法如何解决?
我的操作系统详细信息:
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 Moved Permanently ”,但下面的请求给了我一个“ 307 Internal Redirect ”。
所以这似乎是一个服务器问题。问题只是,如果它是 mod_rewrite 中的错误还是我的错,因为规则不正确。
编辑:我现在也使用来自Ondřej Surý 的 Apache PPA的当前 apache 版本 2.4.27-5.1+ubuntu16.04.1+deb.sury.org+1 进行了测试
问候,托马斯
好的,经过长时间的搜索,我终于找到了原因。我在我的 https 网站上设置了 HTTP Strict-Transport-Security (HSTS),这就是为什么浏览器不会再次启动以在该 url 上打开 http 网站并强制使用 https 协议的原因。
给定的例子都是有效的。