我有一个网站,似乎不能从非www重定向到www。

我的Apache配置如下:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

我错过了什么?


当前回答

要从你的URL网站中删除www,请在。htaccess文件中使用以下代码:

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

要在你的网站URL中强制使用。htaccess上的这段代码

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

YourSite.com必须替换为您的URL。

其他回答

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

This starts with the HTTP_HOST variable, which contains just the domain name portion of the incoming URL (example.com). Assuming the domain name does not contain a www. and matches your domain name exactly, then the RewriteRule comes into play. The pattern ^(.*)$ will match everything in the REQUEST_URI, which is the resource requested in the HTTP request (foo/blah/index.html). It stores this in a back reference, which is then used to rewrite the URL with the new domain name (one that starts with www).

[NC]表示不区分大小写的模式匹配,[R=301]表示使用代码301进行外部重定向(资源永久移动),[L]停止所有进一步重写,并立即重定向。

如果你有多个域名(可选)

-如果所有这些域名都使用https(因为他们应该)

-如果你想让所有的域名都使用www。domainName

这将避免doble重定向(http://non www到http://www,然后到https://www)

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

And

<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

您应该将重定向代码301更改为最方便的代码

我在WP Multisite上有一个类似的任务,其中重定向规则必须是通用的(对于我添加到网络中的任何给定域)。我首先解决了向域(停放的域)添加通配符。注意。com之后。

CNAME * domain.com.

然后我在我的多站点根目录下的.htaccess文件中添加了以下代码行。我想它适用于任何网站。

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

希望这能有所帮助。

ps.如果你想从not www重定向到www,把最后一行改为

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

不要总是使用Redirect permanent(或者为什么将来会出现问题)

如果以后有机会添加子域,不要使用永久重定向。

因为如果客户端使用了一个没有注册为VirtualHost的子域,他可能永远也不会到达这个子域,即使后来注册了。

重定向永久发送一个HTTP 301永久移动到客户端(浏览器),他们中的许多人永远缓存这个响应(直到缓存被[手动]清除)。因此,使用该子域将始终自动重定向到www.***,而无需再次请求服务器。

请参阅浏览器缓存HTTP 301多长时间?

使用重定向

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org -何时不使用mod_rewrite

Apache.org -规范主机名

试试这个:

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