当前位置:  开发笔记 > 前端 > 正文

apache从非www重定向到www

如何解决《apache从非www重定向到www》经验,为你挑选了9个好方法。

我有一个似乎没有从非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] 

我错过了什么?



1> Greg Hewgill..:

使用重写引擎是解决此问题的一种非常重要的方法.这是一个更简单的解决方案:


    ServerName example.com
    Redirect permanent / http://www.example.com/



    ServerName www.example.com
    # real server configuration

然后,您将有另一部分ServerName www.example.com用于您的真实服务器配置./在使用Redirect指令的时候,Apache会自动保留任何内容,这是一个常见的错误概念,说明为什么这个方法不起作用(事实上它确实如此).


使用此建议时,我收到错误"example.com上的网页导致了太多重定向".别人有这个问题吗?
你如何为拥有ssl虚拟主机的网站做到这一点?
@JonathanBerger如果你重定向太多,那么你可能没有很好地配置文件.确保有2个VirtualHosts:一个是非www,这是上面的,另一个是ServerName www.example.com,它有真正的配置.另外,请确保在www.example.com配置中没有重定向(mod_alias和mod_rewrite).
@BlackDivine:在另一个方向上做这件事并不神奇.只需将"www.example"和"示例"交换到样本中的任何位置即可.
对于虚拟主机服务器,例如example.com,我有`重定向301/http:// example2.com/extra /`但是当它重定向时,它会错过尾随斜杠,这意味着`example.com/blah`转到`example2.com/extrablah`.有任何想法吗?(Apache 2.2.22)
@Peter Howe:将ServerName设置为example.com并包含重定向的`VirtualHost`块应该在具有www.example.com域名的域之后,以避免这种情况.

2> 小智..:

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]


非常简短的回答......但是要点......不确定这是投票还是投票
哦,这很整洁,这可以包含在顶层的服务器配置中(如果是这样)将适用于每个虚拟主机!

3> cherouvim..:

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


这是最好的答案,因为它很干净,保持路径(不像答案#1)并且不使用重写.
你是对的,我不小心把www.在ServerAlias中使用*.通配符.因为我搞砸了VirtualHost条目的排序,*.当我不认为它时,通配符有机会匹配.

4> 小智..:

要从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.


在$ 1之前删除斜杠,在redirect => RewriteRule ^(.*)$ http://www.yourSite.com$1 [R = 301]之后没有双斜杠(//)
什么是.html的第二部分?

5> 小智..:
    
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         
      

    

    
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    

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

如果失败了,它就会出现在第二个虚拟主机部分.除此之外,www.example.com以外的任何内容都会重定向到www.example.com.

这里的订单很重要.如果首先添加第二个virtualhost指令,则会导致重定向循环.

此解决方案会将对您域名的任何请求重定向到www.yourdomain.com.

干杯!



6> weotch..:

这类似于许多其他一些增强功能的建议:

无需对域进行硬编码(适用于接受多个域或环境之间的vhost)

保留方案(http/https)并忽略先前%{REQUEST_URI}规则的影响.

不受以前RewriteRule类似影响的路径部分%{REQUEST_URI}是.

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


几乎完美.它必须是%{HTTP_HOST} $ 1,而不是%{HTTP_HOST}/$ 1(或者它会使斜杠加倍)

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

这从HTTP_HOST变量开始,该变量仅包含传入URL(example.com)的域名部分.假设域名不包含a www.并且与您的域名完全匹配,则RewriteRule开始起作用.该模式^(.*)$将匹配其中的所有内容REQUEST_URI,即HTTP请求(foo/blah/index.html)中请求的资源.它将它存储在后引用中,然后用于使用新域名(以域名开头www)重写URL .

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



8> mikep..:

非www => www和对面www =>非www的重定向代码..htaccess文件中没有硬编码域和方案.因此将保留原始域和http/https版本.

APACHE 2.4和NEWER

非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和NEWER

非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获得...



9> 小智..:

我跑了这个......

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

我需要在新服务器上对25个以上的域进行通用,因此该指令位于标记中的virtual.conf文件中.(dir是所有docroots的父母)

我不得不对重写规则进行一些修改,因为完整的docroot正在进行模式匹配,尽管http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html说关于它只是主机和端口之后的东西.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有