将所有页面重定向到非 www,并将一个页面重定向到 www

将所有页面重定向到非 www,并将一个页面重定向到 www

我想将我的所有内部页面(例如example.com/about:)重定向到其非 www 版本,但我希望我的主页(https://example.com)重定向到其 www 版本(https://www.example.com)。

在网上查了很多文章,但是都没有效果。

如果设置了两条规则,那么内部页面就可以正常重定向,但主页会陷入循环。

我不知道如何编码,所以请你写下代码,然后粘贴到我的.htaccess文件中

目前,我已将所有页面设置为重定向到非 www 版本(甚至主页),代码如下:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
</IfModule>
# BEGIN Sitepad
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
# END Sitepad

答案1

在网上查了很多文章,但是都没有效果。

可能是因为这是一个奇怪的要求。如果你能找到任何可以简单复制/粘贴的代码来实现这一点,我会感到惊讶。

但是,假设您正在为所有内部链接构建正确的绝对 URL(因为您不能在内部链接到重定向的 URL),那么.htaccess如果您了解现有的指令,这实现起来相对简单。

RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]

正则.*表达式RewriteRule 图案火柴一切。具体来说,它匹配 0 个或多个任意字符,如量词所示*。它匹配空 URL 路径(即“主页”)和每个非空 URL 路径(即其他所有内容)。

您需要修改上述正则表达式,使其匹配非空 URL 路径(即除主页之外的所有内容)。并创建另一条规则(在另一个方向),仅匹配空 URL 路径。

index.php(这利用了 mod_dir为主页请求提供服务的事实,而不是随后的 mod_rewrite 指令。)

要匹配 1 个或多个(即非空 URL 路径),您可以使用+(加号)量词,而不是*(星号/星号)。

例如:

# Redirect everything except the homepage (from www to non-www)
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.+)$ https://example.com/$1 [L,R=301]

# Redirect the homepage only (from non-www to www)
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^$ https://www.example.com/ [L,R=301]

您需要在测试之前清除浏览器缓存,因为之前将主页从 www 重定向到非 www 的 301(永久)重定向已被浏览器缓存。

首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。

相关内容