好的,所以我在同一个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和subdir
) mod_rewrite
甚至到达第二个规则(在任一节)。
我猜想我正在做一些明显的错误(尤其是因为Apacheconfiguration不是我的核心技能),但是我看不到它。 看看mod_rewrite
文档和configuration部分如何合并的文档似乎也不回答我的问题,除非我读错了,所以我完全丧失。
任何人都可以看到(可能是明显的)我犯的错误?
意图与subdir下的第二个RewriteRule
发送用户到根,删除子目录path?
传递给你的源regex的string的上下文依赖于<Directory>
上下文 – 所以对/subdir/something.html
的请求会给/var/www/html
规则一个subdir/something.html
string来匹配而/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>