mod_rewrite 将站点根目录和子目录从 HTTP 重定向到 SSL

mod_rewrite 将站点根目录和子目录从 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,他们会被重定向到站点根目录 ( 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>

相关内容