我无法使用以下规则获取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虚拟主机部分设置的。 问题是,redirect只能在第一次使用。 当我在http端口4388上input不同的URL时,我第二次被redirect到https://home.myhome.net:438 8 / …
例如:
任何想法如何解决这个问题?
我的操作系统细节
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
这是我的虚拟主机configuration,这是不同的,因为我做了更多的testing,但同样的行为。 我也放弃了testing所有其他重写规则,结果相同(以及我如何评论,每次我刷新浏览器caching的testing)。
<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.这就是为什么我需要检查端口和主机名只匹配外部stream量。
编辑 :好吧,我已经find了一些东西,但也没有一个解决scheme:我比较了第一个和以下的浏览器请求/响应与浏览器开发工具 – >networking选项卡:
第一个要求给我“ 永久移动301 ”,但是下面的请求给了我一个“ 307内部redirect ”。
所以这似乎是一个服务器问题。 问题只是,如果它是mod_rewrite中的Bug,或者是我的错,因为规则不好。
编辑 :我现在也testing了当前的Apache版本2.4.27-5.1 + ubuntu16.04.1 + deb.sury.org + 1从OndřejSurý的Apache PPA
问候,托马斯
好吧,经过漫长的search,我终于find了原因。 我已经在我的https网站上设置了HTTP Strict-Transport-Security(HSTS),这就是为什么浏览器不会重新开始在该url上打开http网站并强制https协议。
给出的例子都在工作。