ChatGPT解决这个技术问题 Extra ChatGPT

通用 htaccess 将 www 重定向到非 www

我想将 www.example.com 重定向到 example.com。以下 htaccess 代码使这种情况发生:

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

但是,有没有办法在不硬编码域名的情况下以通用方式做到这一点?

请务必注意,如果您不使用 www(或其他子域),那么所有 cookie 都将提交到每个子域,并且您将无法拥有无 cookie 的子域来提供静态内容,从而减少在浏览器和服务器之间来回发送的数据量。您以后可能会后悔的事情:twitter.com/codinghorror/statuses/1637428313
要考虑的另一件事是,确保您在页面中设置的规范名称没有 www,以避免可能的重复内容惩罚。此外,如果您的链接中有绝对网址,请确保它们也都是非 www。
在我看来,最好保留显式重定向,尤其是在复制另一个域的配置时,这可能需要不同的调整(在某些情况下 www 域更好)weboptimizer.ch/2014/01/redirection-www
为什么这个解决方案适用于除根 URL 之外的所有情况?例如,domain.com 不会指向 domain.com,而 domain.com/page1 会重定向到 domain.com/page1
如果您希望在维护协议(HTTP 或 HTTPS)的同时将 www 重定向到非 www,请参阅以下相关问题:Redirecting www to non-www while maintaining the protocol HTTP or HTTPS

V
Volomike
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Michael's 相同,除了这个有效:P


如果它不起作用,您可能缺少使其起作用的 RewriteEngine On 前体。
@Ben,我将如何反向使用它来将 www 添加到非 www 网站?
它将 http://www.domain.com/ 重定向到 http://domain.com//。您应该将 / 添加到 RewruteRule。这对我有用RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]
我遇到了与 Vladimir 相同的问题,它使用双斜杠重定向到 http://domain.com//。所以我做了RewriteRule ^(.*)$ http://%1$1 [R=301,L],到目前为止它似乎正在工作
请使用以下解决方案而不是重写引擎,它既优雅又快得多:stackoverflow.com/questions/1100343/…
N
Nhan

但是,如果我们需要对单独的 http 和 https 执行此操作:

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

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

www.example.com/ 重定向到 example.com// 有什么方法可以删除多余的斜线?
好问题。我想快速的解决方案是在上述这些之前使用额外的规则(即仅适用于这种情况)。例如:RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
@BobbyS 我使用了 this article 中的解决方案。它将 www 和 HTTP 重定向到非 www HTTPS,并且还处理尾随的 /
如果您将这些指令直接放在服务器配置(或虚拟主机)中,您只会得到一个额外的斜杠(在 URL 路径的开头)。在 .htaccess 中,您不应该得到额外的斜线。 (请注意,如果您在服务器配置中执行此重定向,那么您可能不应该使用 mod_rewrite 开始......在适当的 vhost 容器中使用简单的 mod_alias Redirect 会更有效且不易出错.)
D
Dmytro

将非 www 重定向到 www(两者:http + https)

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

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

@nightcoder 这是因为我的反向重定向解决方案(从非 www 到 www)而不是 Andron 的
注意:如果您打算将子域名用于其他目的,此解决方案可能会导致一些问题。例如,app.yourdomain.com 将被重定向到 www.app.yourdomain.com。
这与问题的答案完全相反。
我不得不添加 RewriteEngine OnRewriteBase /,但除此之外效果很好。
C
Community

如果您想在 httpd.conf 文件中执行此操作,您可以在没有 mod_rewrite 的情况下执行此操作(显然它对性能更好)。

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

我在这里得到了答案:https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507


S
Salman A

以下是将 www URL 重定向到 no-www 的规则:

#########################
# redirect www to no-www
#########################

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

以下是将无 www 的 URL 重定向到 www 的规则:

#########################
# redirect no-www to www
#########################

RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]

请注意,我使用 NE 标志来防止 apache 转义查询字符串。如果没有此标志,apache 会将请求的 URL http://www.example.com/?foo%20bar 更改为 http://www.example.com/?foo%2250bar


您可以编写代码将http重定向到https以及将www重定向到非www吗
将 http:// 更改为 https:// 以在更改时将其强制为 HTTPS。您还需要为未被这些规则重定向的流量添加常规 http->https 重定向。
V
Volomike
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

RewriteCond 捕获 HTTP_HOST 变量之后 www. 中的所有内容并将其保存在 %1 中。

RewriteRule 捕获不带前导 / 的 URL 并将其保存在 $1 中。


sans leading "/" - 在 .htaccess(如问题中所述)中没有前导 /,因此模式永远不会匹配并且重定向永远不会发生。 (在 servervirtualhost 上下文中只有一个前导斜杠。)此外,如果您在此之后有任何 mod_rewrite 指令,那么您将需要 L 标志。
G
Greg

尝试这个:

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

如果主机以 www 开头,我们将整个主机粘贴到 URL 的开头,然后去掉“www”。


RoBorg,不幸的是你的设置不起作用,如果我尝试这个:example.com/hello/world我最终在这里:example.com/hello/world/world我还必须在 First RewriteRule 中的 %{HTTP_POST} 之后添加一个斜杠
我正在使用 Apache/2.2.9 (Unix)。它适用于重定向到网站的 www.website 但适用于以下内容:website/test ->转到:websitetest 我通过添加另一个 / 第二个错误来解决此问题:website/test/n 转到 websitetest/n/n
这个问题与@deepwell 相同。
早期读者遇到的问题是因为这些指令适用于服务器配置(或虚拟主机),而不是 .htaccess。在 目录 上下文 (.htaccess) 中,您应该将第一个 RewriteRule 更改为:RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](需要 Apache 2.2.12+)。请注意添加斜杠和 DPI(丢弃路径信息)标志 - 以防止部分 URL 路径看似重复(实际上是“路径信息”),如先前评论中所述。但是,有更简单的指令 - 如其他答案所述。
G
Gregor Macgregor

完整的通用 WWW 处理程序,http/https

我没有看到完整的答案。我用它来处理 WWW 包含。

通用的。不需要域信息。强制主域上的 WWW:www.domain.com 删除子域上的 WWW:sub.domain.com 保留 HTTP/HTTPS 状态。允许域/子域的单个 cookie

请让我知道这是如何工作的,或者我是否留下了漏洞。

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

原始问题要求将 www 重定向到非 www。您正在强制包含 www
这是唯一对我有用的解决方案,包括文件夹和子文件夹。我正在使用 .htaccess
D
Donny Kurnia

我发现可能有很多关于 htaccess 重定向的错误信息。首先,确保您的站点使用 Apache 在 Unix 上运行,而不是在 Windows 主机上运行,如果您希望此代码能够正常工作。

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

(但请确保每行文本之间没有行间距;我在行之间添加了一个额外的空格,因此它在此窗口中呈现正常。)

这是一段代码,可用于将您网站的 www 版本指向 http:// 版本。还有其他类似的代码也可以使用。


为什么你的名字叫 Htaccess Redirect?
p
pelajar
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

对于子文件夹


R
Rajith Ramachandran

使用 https 从 www 到非 www

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

R
Rick

对于那些需要能够在没有“www”前缀的情况下访问整个站点的人。

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

确保将其添加到以下文件中

/site/location/.htaccess 

此示例不完整 - 您没有设置 protossl 环境变量(这不是标准/服务器变量)。这将始终为空,因此将始终重定向到 http。 (在代码前面设置 protossl 背后的想法是当您希望在重定向时保留协议。但是,这些天您可能应该一直重定向到 https。)
M
Manifest Man

使用 .htaccess 重定向到 www 或非 www:

只需将以下代码行放入您的主根 .htaccess 文件中。在这两种情况下,只需将 domain.com 更改为您自己的主机名。

重定向到 www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.tld [NC]
  RewriteRule ^(.*)$ http://www.domain.tld/$1 [L,R=301]
</IfModule>

重定向到非 www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.tld [NC]
  RewriteRule ^(.*)$ http://domain.tld/$1 [L,R=301]
</IfModule>

“将 DOT 更改为 => . !!!” - 为什么不首先写一个.?!
O
Oldskool

我使用上述规则将 www 转发到 no www 并且它适用于主页,但是在它们转发到 /index.php 的内部页面上

我在我的 .htaccess 文件中发现了另一个导致此问题的规则,但不知道该怎么做。任何建议都会很棒:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

您需要在引用的规则之前放置非 www 重定向规则。
A
Amit Verma
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

如果要同时删除 httphttps 上的 www,请使用以下命令:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

这会重定向非 ssl

http://www.example.com

http://example.com

和 SSL

https://www.example.com

https://example.com

在 apache 2.4.* 上,您可以使用带有 if 指令的 Redirect 来完成此操作,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

M
Martijn Pieters

使用:Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

或 .htaccess:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]

和 PHP 方法:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

阿贾克斯

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

w
wattostudios

我让它工作的唯一方法......

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/$1 [R=301,L]

v
vladkras

如果你强迫 www。在 url 或强制 ssl 协议中,然后尝试在 htaccess 文件中使用可能的变体,例如:

RewriteEngine On
RewriteBase /

### Force WWW ###

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

## Force SSL ###

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

## Block  IP's ###
Order Deny,Allow
Deny from 256.251.0.139
Deny from 199.127.0.259

Apache 可以侦听另一个端口,例如 81。因此,我建议不要使用 RewriteCond %{SERVER_PORT} 80,而是使用这样更通用的检查:RewriteCond %{HTTPS} off
C
Community

这已更新为适用于 Apache 2.4:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Michael's 的唯一变化是删除 [NC],这会产生“AH00665”错误:

不支持非正则表达式模式“-f”的 NoCase 选项,将被忽略


较早的答案不需要“更新以在 Apache 2.4 上工作”。您引用的“警告”(AH00665)与不同的指令相关(例如,如果您有类似 RewriteCond %{REQUEST_FILENAME} !-f [NC] 的内容)。 NC 标志在上面没有什么区别,但是,NC 标志应该在这里使用的原因是捕获一小部分(错误地)发送大写主机名的机器人流量。
l
luky

这里选择的答案和许多其他解决方案在 / 之后删除了 url 的一部分,所以基本上它总是重定向到主域,至少对我来说是这样。所以我在斜杠后添加了关于完整路径的工作示例。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [L,R=301]

B
Bobík

如果 .htaccess 自定义不是理想选项,则替代方法:

我创建了简单的重定向服务器供公众使用。只需添加 A 或 CNAME 记录:

CNAME   r.simpleredirect.net
A       89.221.218.22

更多信息:https://simpleredirect.net


该网站现在显示“此服务将很快关闭。”
l
local

我不确定你为什么要删除 www。但反向版本将是:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

这个脚本的优点是:如果你有类似 test.whattimein.com 或任何其他(开发/测试环境)的东西,它不会将你重定向到原始环境。


是否应包含 www 子域实际上是个人喜好问题,可能取决于域名和目标受众。上面发布的用于将 www 重定向到 none-www 的通用代码也可以处理测试环境,因为重定向仅在“www.”时发生。遇到子域。
这个问题与用户所问的相反,它只会污染帖子。
J
Jeaf Gilbert

添加了如果本地主机,则忽略重定向(用于本地环境中的开发目的)。如果不是 localhost AND(不是 https 或者是 www),则重定向到 https 和非 www。

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

请详细说明您的代码,以便 OP 了解它如何回答问题。
C
Chirag Parekh

您好,您可以在您的 htaccess 文件中使用以下规则:

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

问题是要求一个不包括域名的“通用”解决方案。您的解决方案也与问题中所要求的完全相反(非 www 到 www,而不是 www 到非 www),无需解释。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅