好的,我有两个网站在同一个 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
,他们会被重定向到站点根目录 ( https://www.domain.com/
),从而丢弃其余的请求路径。即使我<IfModule mod_rewrite.c>
从子目录的<Directory>
部分中删除整个部分,情况也是如此,如果我删除每个配置部分中的第一个RewriteCond
/RewriteRule
对(我们添加它只是为了尝试修复此问题),情况也是如此。
我不明白为什么第一条规则(在任一部分<Directory>
)没有先生效,以便用户在到达第二条规则(在任一部分)之前立即被重定向到https://www.domain.com/subdir
(使用 SSL 和subdir
) 。mod_rewrite
我猜我肯定做错了什么(尤其是因为 Apache 配置不是我的核心技能),但我就是看不出来。mod_rewrite
文档以及文档配置部分如何合并似乎也回答不了我的问题,除非我读错了,所以我完全不知所措。
有人能看到我犯的(可能很明显的)错误吗?
答案1
子目录下的第二个意图是RewriteRule
将用户发送到根目录,并删除子目录路径?
传递给源正则表达式的字符串的上下文取决于上下文<Directory>
- 因此,对的请求/subdir/something.html
将为/var/www/html
规则提供要匹配的字符串subdir/something.html
,而其中的规则/var/www/html/subdir
将与之匹配something.html
。
您可以使用RewriteBase
覆盖上下文,这样就可以使用以下两种方式之一修复配置,使其按预期工作:使用RewriteBase
:
<Directory "/var/www/html/subdir">
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
# ... etc etc, no other changes needed
..或者,通过更改目标 URL 来考虑上下文(第一条规则永远不会匹配,因为它subdir
不在字符串中):
<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>