Apache从非wwwredirect到www

我有一个网站似乎不是从非wwwredirect到www。

我的Apacheconfiguration如下:

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

我错过了什么?

使用重写引擎是解决这个问题的一个相当重要的方法。 这是一个更简单的解决scheme:

 <VirtualHost *:80> ServerName example.com Redirect permanent / http://www.example.com/ </VirtualHost> <VirtualHost *:80> ServerName www.example.com # real server configuration </VirtualHost> 

然后,您将拥有ServerName www.example.com另一个<VirtualHost>部分,用于实际的服务器configuration。 在使用Redirect指令时,Apache会自动保留任何东西,这是一个常见的误解,说明为什么这种方法不起作用(实际上是这样)。

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

  RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
 <VirtualHost *:80> ServerAlias example.com RedirectMatch permanent ^/(.*) http://www.example.com/$1 </VirtualHost> 

要从您的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必须replace您的URL

  <VirtualHost *:80> DocumentRoot "what/ever/root/to/source" ServerName www.example.com <Directory "what/ever/root/to/source"> Options FollowSymLinks MultiViews Includes ExecCGI AllowOverride All Order allow,deny allow from all <What Ever Rules You Need.> </Directory> </VirtualHost> <VirtualHost *:80> ServerName example.com ServerAlias *.example.com Redirect permanent / http://www.example.com/ </VirtualHost> 

这是上面的代码发生的事情。 第一个虚拟主机块会检查请求是否为www.example.com,并在该目录中运行您的网站。

如果没有的话,就来到第二个虚拟主机部分。 除了www.example.com之外的任何东西都会被redirect到www.example.com。

这里的命令很重要。 如果首先添加第二个虚拟主机指令,则会导致redirect循环。

此解决scheme将redirect到您的域的任何请求,www.yourdomain.com。

干杯!

这与许多其他build议类似,有几个增强function:

  • 不需要对域进行硬编码(适用于接受多个域的虚拟主机或环境之间)
  • 保留该scheme(http / https)并忽略以前的%{REQUEST_URI}规则的效果。
  • 以前的RewriteRule不受像%{REQUEST_URI}的影响。

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

这从HTTP_HOSTvariables开始,该variables仅包含传入URL( example.com )的域名部分。 假设域名不包含www. 并准确地匹配您的域名,然后RewriteRule进入游戏。 模式^(.*)$将匹配REQUEST_URI中的所有内容, REQUEST_URI是HTTP请求( foo/blah/index.html )中请求的资源。 它将它存储在一个后向引用中,然后用来用新的域名(一个以www开头)重写URL。

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

我跑这个…

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

我需要在我们的新服务器上为25个以上的域进行通用,所以这个指令位于我的virtual.conf文件中的一个<Directory>标签中。 (dir是所有文章的父项)

但是,我必须对重写规则进行一些修改,因为尽pipehttp://httpd.apache.org/docs/2.2/mod/mod_rewrite.html提供了完整的文档根据模式匹配关于它只是主机和端口后的东西。

将domain.tldredirect到www。

可以在Apache指令或.htaccess文件中添加以下行:

 RewriteEngine on RewriteCond %{HTTP_HOST} . RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
  • 其他sudomains仍在工作。
  • 无需调整线条。 只需复制/粘贴在正确的地方。

如果您修改虚拟主机,请不要忘记应用apache更改。

(基于默认的Drupal7 .htaccess,但应该在很多情况下)

 <VirtualHost *:80> ServerAlias example.com RedirectMatch permanent ^/(.*) http://www.example.com/$1 </VirtualHost> 

这不仅会redirect域名,而且还会redirect内页。

example.com/abcd.html ==> http://www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> http://www.example.com/ab/cd.html?ef=gh

如果你使用的是Apache 2.4,而不需要启用重写apache模块,你可以使用如下所示:

 # non-www to www <If "%{HTTP_HOST} = 'domain.com'"> Redirect 301 "/" "http://www.domain.com/" </If> 

非www => www和相反www =>非www的redirect代码。 .htaccess文件中没有硬编码域和scheme。 所以原始域和http / https版本将被保留。

APACHE 2.4和更新

非WWW => WWW:

 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] 

注意:不适用于%2 {REQUEST_SCHEME}不可用的Apache 2.2。 为了与Apache 2.2兼容,请使用下面的代码或将%{REQUEST_SCHEME}replace为固定的http / https。


APACHE 2.2和更新

非WWW => WWW:

 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 %{HTTPS}s ^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中获得…

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

检查这个完美的工作

不要总是使用Redirect permanent (或为什么它可能会导致问题)

如果稍后有机会添加子域名,请勿使用redirect permanent域名。

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

redirect permanent发送一个HTTP 301 Moved Permanently到客户端(浏览器),他们中的很多caching这个响应永远(直到caching清除[手动])。 因此,使用该子域将始终自动redirect到www。***,而无需再次请求服务器。

请参阅浏览器cachingHTTP 301s多长时间?

所以只需使用Redirect

 <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] 

我只是有一个相同的问题。 但用这个解决了

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

这个规则redirect非www到www。

而这个规则将wwwredirect到非www

RewriteEngine On RewriteCond %{HTTP_HOST} !^my-domain\.com$ [NC] RewriteRule ^(.*)$ http://my-domain.com/$1 [R=301,L]

请参阅http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

这适用于我:

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

我使用预见模式(?!www.domain.com)将所有域redirect到www子域时排除www子域,以避免Apache中的无限redirect循环。

我使用的代码是:

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

如果使用两个不同ServerName<VirtualHost *:80>块的上述解决scheme…

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

…那么你也必须设置NameVirtualHost On

如果你不这样做,Apache不会允许自己使用不同的ServerName来区分这些块,所以你会得到这个错误信息:

 [warn] _default_ VirtualHost overlap on port 80, the first has precedence 

…或者不redirect发生,或者你有一个无限的redirect循环,取决于你先放哪个块。

我在WP多站点上有类似的任务,其中redirect规则必须是通用的(对于我添加到networking的任何给定的域)。 我解决了首先添加通配符到域(停放域)。 注意。 之后。

 CNAME * domain.com. 

然后我将下面几行添加到我的多站点根目录下的.htaccess文件中。 我想这可以适用于任何网站。

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

希望这会有所帮助。

PS。 如果您想从不www转到www,请将最后一行改为

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

当使用多个虚拟主机时,我发现使用ServerAlias更容易(也更有用)。

 <VirtualHost xxxx:80> ServerName www.example.com ServerAlias example.com .... </VirtualHost> 

这也适用于https虚拟主机。