mod_rewriteredirect站点根目录和子目录从HTTP到SSL

好的,所以我在同一个webroot中有两个站点 – 主站点(在根目录中)和子目录中不相关的一堆文件。 我们希望这两个网站都能在SSL下强制渲染。

目前,我的httpd.conf的相关块如下所示:

 <Directory "/var/www/html"> <IfModule mod_rewrite.c> RewriteEngine on <IfModule mod_ssl.c> RewriteCond %{HTTPS} !=on RewriteRule ^subdir(.*)$ https://%{HTTP_HOST}/subdir$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] </IfModule> </IfModule> </Directory> <Directory "/var/www/html/subdir"> <IfModule mod_rewrite.c> RewriteEngine on <IfModule mod_ssl.c> RewriteCond %{HTTPS} !=on RewriteRule ^subdir(.*)$ https://%{HTTP_HOST}/subdir$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] </IfModule> </IfModule> </Directory> 

但如果用户直接浏览到http://www.domain.com/subdir ,则会被redirect到站点根目录( https://www.domain.com/ ),丢弃请求path的其余部分。 即使我从子目录的<Directory>部分中删除了整个<IfModule mod_rewrite.c>节,也是如此,如果我删除每个configuration节中的第一个RewriteCond / RewriteRule对(我们只是添加尝试解决这个问题)。

我不明白为什么第一条规则(在任何一个<Directory>部分)没有首先生效,所以用户会立即redirect到https://www.domain.com/subdir (带有SSL和subdirmod_rewrite甚至到达第二个规则(在任一节)。

我猜想我正在做一些明显的错误(尤其是因为Apacheconfiguration不是我的核心技能),但是我看不到它。 看看mod_rewrite文档和configuration部分如何合并的文档似乎也不回答我的问题,除非我读错了,所以我完全丧失。

任何人都可以看到(可能是明显的)我犯的错误?

意图与subdir下的第二个RewriteRule发送用户到根,删除子目录path?

传递给你的源regex的string的上下文依赖于<Directory>上下文 – 所以对/subdir/something.html的请求会给/var/www/html规则一个subdir/something.htmlstring来匹配而/var/www/html/subdir的规则将与something.html匹配。

您可以使用RewriteBase覆盖上下文,因此可以按照以下两种方式之一修改configuration以按预期工作: 使用RewriteBase

 <Directory "/var/www/html/subdir"> <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / # ... etc etc, no other changes needed 

..或者通过更改目标URL来考虑上下文(第一个规则永远不会匹配,因为subdir不在string中):

 <Directory "/var/www/html/subdir"> <IfModule mod_rewrite.c> RewriteEngine on <IfModule mod_ssl.c> RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/subdir/$1 [R=301,L] </IfModule> </IfModule> </Directory>