【问题标题】:Redirect non-www to www giving me hundreds of 404's将非 www 重定向到 www 给我数百个 404
【发布时间】:2021-10-24 18:33:36
【问题描述】:

感谢任何可以花点时间查看此内容的人。

最近我在我的网站中创建了一个新部分“子域”,在这个新文件夹中,我包含了一个 Joomla CMS 安装,网址如下所示:http://www.example.com/subdomain/

在这个文件夹中,我添加了一个 htaccess 文件。

## No directory listings
# Redirect non-www to www:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

当我尝试访问说 http://example.com/subdomain/anytrailingstring 时,它并没有像我预期的那样将我重定向到 http://www.example.com/subdomain/anytrailingstring,而是重定向到 http://www.example.com/anytrailingstring 忽略 /subdomain/ 这当然是一个不存在的页面,因此404。

这是个问题。

除此之外,我在根 .htacces 文件中没有任何指令:

DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

也许有人可以看到为什么子域 htaccess 没有正确重定向吗?我错过了什么吗?

我根本不擅长 htaccess,如果有人可以帮助我,我将不胜感激。 谢谢!

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    

    您需要使用REQUEST_URI 服务器变量而不是反向引用 ($1)。 RewriteRule pattern(第一个参数)匹配的 URL 路径是相对于当前目录的,因此不包括父子目录(即您的示例中的 /subdomain)。

    改为这样:

    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    您需要清除浏览器缓存,因为错误(301 - 永久)重定向将被浏览器缓存。使用 302(临时)重定向进行测试以避免潜在的缓存问题。

    但是,有几个问题:

    • 为什么不使用 HTTPS? (您在父 .htaccess 文件中重定向到 HTTPS - 但现在这已被子目录中的 mod_rewrite 指令覆盖。)
    • 为什么不在父 .htaccess 文件中包含它?

    更新:因此,考虑到上述几点...如果您想将此规则移动到根目录中的父 .htaccess 文件中,则如下所示:

    DirectoryIndex index.php
    Options +FollowSymLinks
    RewriteEngine on
    
    # Redirect non-www to www (and HTTPS)
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # Redirect HTTP to HTTPS
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    

    指令的顺序是确保最多只有 1 个重定向(假设您没有实现 HSTS)。

    您不必要地重复了 RewriteEngine 指令(所以我删除了第二个实例)。

    RewriteBase 指令未被使用。

    您的 HTTP 到 HTTPS 规则中的捕获子组不是必需的。 IE。在这种情况下,^ 优于 ^(.*)$


    旁白:。

    ...在我的网站和这个新文件夹中的一个新部分“子域”包括一个 Joomla CMS 安装,网址如下所示:http://www.example.com/subdomain/

    这是一个子目录,而不是“子域”。

    这是一个“子域”:

    http://subdomain.example.com/
    

    【讨论】:

    • 我同意子目录,是的,你是对的,那应该是 https。它是从 12 年前的一个帖子中提取的。问题:我现在应该把它放在子文件夹还是根 htaccess 文件中?我猜你暗示它可能应该在根目录中。对吗?
    • "这个我现在应该放在子文件夹还是根 htaccess 文件中?" - 好吧,我想知道您是否对为什么这应该是子目录有特定要求?但是,通常这应该在根 .htaccess 文件中,因为您通常希望在整个站点上强制执行 www。我已经更新了我的答案。
    • 非常感谢。出于某种原因,它在根 htacess 中没有做任何事情,但我将它添加到文件夹中并且它工作正常!祝你周日愉快
    • "它在根 htacess 中没有做任何事情" - 您在子目录 .htaccess 文件中有其他指令吗?如果是这样,那么父 .htaccess 文件中的指令可能会被覆盖(这也是您可能将指令包含在子目录中的原因之一)。否则,他们真的应该在根目录下工作。
    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 2019-03-09
    • 2021-08-03
    • 2011-11-05
    • 2011-12-01
    • 2013-12-20
    • 2022-03-04
    相关资源
    最近更新 更多