.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 off
RewriteRule ^(.*)$ 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 中删除目录名称