我有一个网站,似乎并没有重定向非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] 

我是什么丢失?

有帮助吗?

解决方案

使用重写引擎是解决这个问题的一个相当重量级方式。下面是一个简单的解决方案:

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

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

然后你必须与<VirtualHost>另一 ServerName www.example.com 部分的真实服务器组态。阿帕奇当使用/后自动保存任何东西 Redirect指令,这就是为什么这种方法将不起作用(当实际上它)常见的误解。

其他提示

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>

要从您的www网站上删除URL.htaccess文件中使用此代码:

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

要强制www在您的网站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所取代。

    <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以外的任何其他被重定向到www.example.com。

在这里顺序事项。如果第一添加第二个虚拟主机指令,就会造成重定向循环。

此解决方案将任何请求重定向到您的域,以www.yourdomain.com。

干杯!

这是类似于许多其他建议,与一对夫妇增强:

  • 没有必要硬编码域(与虚拟主机,接受多个领域或环境之间)
  • 保护方案(http/https)和忽视的影响之前 %{REQUEST_URI} 规则。
  • 路径部分不受影响通过以前 RewriteRules喜欢 %{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_HOST变量,它包含刚刚进入的URL(example.com)的域名部分。假设该域名不包含www.和完全匹配您的域名,然后重写规则发挥作用。图案^(.*)$将匹配在REQUEST_URI,这是在HTTP请求(foo/blah/index.html)所请求的资源的一切。它存储在此的后参考,然后将其用于重写与新的域名的URL(一个与www开始)。

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

我跑这个...

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

我想这能为我们的新服务器上25+域是普遍的,所以这个指令是在<目录>标签我virtual.conf文件。 (dir是父所有文档根目录)

我不得不做一点上重写规则一个黑客虽然,因为完整的文档根被抬通过对模式匹配,尽管什么的 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html 说,大约仅是主机和端口后的东西。

两个非www => www和相对WWW重定向代码=>非www。没有硬编码域和方案的.htaccess文件。所以原始域和HTTP / HTTPS版本将被保留。

APACHE 2.4和更新的

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

注意:在Apache 2.2不工作,其中%{REQUEST_SCHEME}不可用。对于低于使用Apache 2.2使用的代码兼容或替换%{REQUEST_SCHEME}与固定HTTP / HTTPS。


APACHE 2.2和更新的

NON-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 ...

如果您使用的是Apache 2.4,而无需使重写Apache模块,你可以使用这样的:

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

重定向的领域。顶级域名,以www.

下面几行可以添加无论是在阿帕奇的指示或在。就文件:

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.不喜欢这里但是应该的工作在许多情况下)

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

这将不仅域的名称,但也内 页。像...

例。com/abcd.html ==> www.example.com/abcd.html
例。com/ab/cd。html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

尝试这种情况:结果

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

这是简单!

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

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

检查此完美工作

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

如果有机会的话,你将在以后添加子域名,不要使用redirect permanent

由于如果客户端已使用一个子域,这不是申请为VirtualHost他可能还从未即使它是registred以后达到这一子域。

redirect permanent发送HTTP 301 Moved Permanently给客户端(浏览器)和他们中的很多缓存永远此响应(直到缓存被清除[手动])。因此,使用子域名会永远autoredirect到www。***无需再次请求服务器。

请参阅做浏览器的缓存多久HTTP 301S?

<强>因此只需使用Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - 当不使用mod_rewrite

Apache.org - 典型的主机名

我刚刚有同样的问题。 但与此解决

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

此规则重定向非www到www。

和此规则来重定向到WWW非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)重定向以避免在Apache的无限重定向循环的所有域的子域www时排除www子域。

我使用的代码是:

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

如果使用具有不同<VirtualHost *:80>s 2分ServerName块的上述溶液...

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

...然后您必须设置NameVirtualHost On以及

如果你不这样做,阿帕奇不允许本身使用不同的ServerNames区分块,所以你得到这个错误信息:

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

...和要么没有重定向发生,或者您有无限循环重定向,这取决于哪个块你把第一上。

我曾在一个多站点WP,其中重定向规则必须是一般的(对于任何给定域我想添加到网络)类似的任务。我解决了先加入一个通配符域(域名停放)。请注意。后.COM。

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 x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

这也适用以https虚拟主机。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top