.htaccess 从 URL + 目录中删除 WWW

Posted

技术标签:

【中文标题】.htaccess 从 URL + 目录中删除 WWW【英文标题】:.htaccess Remove WWW from URL + Directories 【发布时间】:2011-09-24 19:08:41 【问题描述】:

这对很多人来说似乎不是问题(阅读:我找不到答案),但我想更新以下 htaccess 代码,不仅从 URL 中删除“www”,而且访问的任何子目录。

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

这样,http://www.example.com/any/ 可以正常解析,但我希望它像根一样重定向到 http://example.com/any/。

【问题讨论】:

【参考方案1】:

我认为您已经接近了,但请尝试以下操作:

# force non-www domain
RewriteCond %HTTP_HOST ^www\.example\.com$ [NC]
RewriteRule (.*) http://example.com/$1 [R=301,L]

不确定您对子目录的确切含义,但这遵循您的示例。

【讨论】:

抱歉,我的意思是 http://www.example.com 和 http://www.example.com/any/ 应该分别重定向到 http://example.com 和 http://example.com/any/。当前设置只允许根重定向。 我刚刚尝试了另一个域,它确实有效。我很好奇为什么它不适用于我正在尝试的那个。无论如何,感谢您的回复。 *现在我知道为什么这对大多数人来说都不是问题。 我收回它,它不起作用。例如http://www.avdra.com/00.districts/06/index.php。但它确实适用于http://www.avdra.com。 我想我刚刚发现了这个问题。此 htaccess 代码不适用于指向子目录的 URL 的附加域。 对于任何有同样问题的人来说,这是一个 HostGator 问题。他们必须自己解决。【参考方案2】:

我遇到了同样的问题(无法从指向附加域上的子目录的 URL 中删除“www”),但经过一些试验和错误后,这似乎对我有用:

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

【讨论】:

这也适用于同一个链接,无需“美化” URL,例如http://www.addondomain.com/projects/a/index.php?where=gallery&cid=4&id=2 -> http://addondomain.com/projects/a/index.php?where=gallery&cid=4&id=2 好的答案 - 这通常无需任何编辑即可正常工作...只需将其放入您的 .htaccess 文件中,您就可以了。 这是目前从主机地址中删除 www 的最佳答案,因为您不需要对域名进行硬编码,因此您可以轻松地将更改推送到远程服务器,而无需修改 .htaccess 。谢谢你的回答。 如果用户输入https://www.domain.com/log-me-in会怎样?他将被重定向到http。所以我需要再次从http 重写为https 对吗? @TheFrost 是的,RewriteCond %HTTPS offRewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]【参考方案3】:

您好,该代码运行良好,除了它在带有一些值和斜线的 URL 中传递 www,它在 URL 中显示参数和值。

RewriteEngine On SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/html text/plain text/xml RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteRule ^(!.(\.gif|\.jpg|\.png|\.swf|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [R=301,NC] RewriteRule ^(.[^.*]+)\/$ ?jogar=$1 [NC] Options -Indexes Options +FollowSymLinks RewriteCond %HTTP_HOST ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http:\/\/%1%REQUEST_URI [R=301,QSA,NC,L]

【讨论】:

【参考方案4】:

我用过它,它对我有用

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

示例:http://www.locphen.vn/he-thong-loc-nuoc-gieng.html -> http://locphen.vn/he-thong-loc-nuoc-gieng.html

【讨论】:

【参考方案5】:

非 www => www 和相反 www => 非 www 的重定向代码。 .htaccess 文件中没有硬编码域和方案。所以源域和http/https版本会被保留。

APACHE 2.4 及更新版本

非万维网 => 万维网:

RewriteEngine On
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^ %REQUEST_SCHEME://www.%HTTP_HOST%REQUEST_URI [R=301,L]

WWW => 非WWW:

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

注意:不能在 %REQUEST_SCHEME 不可用的 Apache 2.2 上工作。为了与 Apache 2.2 兼容,请使用以下代码或将 %REQUEST_SCHEME 替换为固定的 http/https。


APACHE 2.2 及更新版本

非万维网 => 万维网:

RewriteEngine On

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

RewriteCond %HTTPS on
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^ https://www.%HTTP_HOST%REQUEST_URI [R=301,L]

...或更短的版本...

RewriteEngine On
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteCond %HTTPSs ^on(s)|offs
RewriteRule ^ http%1://www.%HTTP_HOST%REQUEST_URI [R=301,L]

WWW => 非WWW:

RewriteEngine On

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

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

...不可能有更短的版本,因为 %N 仅在最后一个 RewriteCond 中可用...

【讨论】:

+1 用于版本选项。问题:不应该使用 NE 标志吗? .. 如果您认为这只会在手动输入 url 时“命中”,那么没有它会很好,但是任何过时的“www.”又如何呢?链接“在野外”。我刚刚在一个古老的电子邮件模板中发现了一个这样的链接:P @DM8 不,NE 标志 (noescape) 不应在这种情况下使用。 URL example.com/?a=1&b=2 正确重定向到例如www.example.com/?a=1&b=2。当您在 .htaccess 中的 URL 中有特殊字符以重定向到例如时,应使用该标志。 RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R](由于 NE 标志,# 在重定向时不会被转义)。 很好的资源,@mikep。请注意,就我而言,我必须使用 %ENV:HTTPS 而不是 %HTTPS。 @typeoneerror 是的,这取决于具体情况,但是 apache-only 配置中的标准变量是 %HTTPS 但是当你使用像 SetEnvIf X-HTTPS on HTTPS=on 这样的自定义东西时(X-HTTPS 来自 apache 之前的代理,例如作为 nginx) 那么你必须使用提到的 %ENV:HTTPS【参考方案6】:

我使用此代码。如果我的访问者的 url 中没有 www,那么这个条件会在 url 中添加 www,否则不需要在 url 中添加 www(因为他已经有了。:))

RewriteEngine On
RewriteCond %HTTP_HOST  !^www\.YOUR-SITE\.com$ [NC]
RewriteRule ^(.*) http://www.YOUR-SITE.com/$1 [L,R]

【讨论】:

以上是关于.htaccess 从 URL + 目录中删除 WWW的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地主机的 .htaccess 从 URL 中删除目录名称

如何使用 htaccess 重写从 url 中删除此目录/文件夹?

htaccess:在提供原始内容时从 URL 中删除子目录

使用htaccess从URL中删除公用文件夹

重写URL以删除查询字符串

htaccess 从 url 中删除参数