apache从非www重定向到www

use*_*196 202 apache mod-rewrite redirect no-www

我有一个似乎没有从非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] 
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Gre*_*ill 495

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

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

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

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

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

小智 80

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]
Run Code Online (Sandbox Code Playgroud)

  • 非常简短的回答......但是要点......不确定这是投票还是投票 (3认同)
  • 哦,这很整洁,这可以包含在顶层的服务器配置中(如果是这样)将适用于每个虚拟主机! (2认同)
  • 我也将此解决方案用于 HTTPS 虚拟主机。只需在第三行的 http 中添加一个“s”即可。 (2认同)

che*_*vim 44

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

  • 这是最好的答案,因为它很干净,保持路径(不像答案#1)并且不使用重写. (7认同)
  • @dmiller309:您是否碰巧在“ServerAlias”中包含了“www.”? (2认同)
  • 你是对的,我不小心把www.在ServerAlias中使用*.通配符.因为我搞砸了VirtualHost条目的排序,*.当我不认为它时,通配符有机会匹配. (2认同)

小智 30

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

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

要强制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]
Run Code Online (Sandbox Code Playgroud)

哪里YourSite.com必须换成你的URL.

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

小智 21

    <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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

干杯!


weo*_*tch 16

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

  • 无需对域进行硬编码(适用于接受多个域或环境之间的vhost)
  • 保留方案(http/https)并忽略先前%{REQUEST_URI}规则的影响.
  • 不受以前RewriteRule类似影响的路径部分%{REQUEST_URI}是.

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

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

Cur*_*ker 10

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

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

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


sys*_*m1n 6

如果您使用的是 Apache 2.4,无需启用重写 apache 模块,您可以使用以下内容:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
Run Code Online (Sandbox Code Playgroud)

  • 被低估的答案。使用此功能,可以避免额外的虚拟主机,这对于自动化 Let'sEncrypt 脚本很有好处。 (3认同)

mik*_*kep 6

非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]
Run Code Online (Sandbox Code Playgroud)

WWW =>非WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

注意:不在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]
Run Code Online (Sandbox Code Playgroud)

...或更短的版本......

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

...短版本不可能,因为%N只能从最后一个RewriteCond获得...


小智 5

我跑了这个......

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

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

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