我有一个似乎没有从非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]
我错过了什么?
使用重写引擎是解决此问题的一种非常重要的方法.这是一个更简单的解决方案:
ServerName example.com Redirect permanent / http://www.example.com/ ServerName www.example.com # real server configuration
然后,您将有另一
部分ServerName www.example.com
用于您的真实服务器配置./
在使用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]
ServerAlias example.com RedirectMatch permanent ^/(.*) http://www.example.com/$1
要从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
.
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.
干杯!
这类似于许多其他一些增强功能的建议:
无需对域进行硬编码(适用于接受多个域或环境之间的vhost)
保留方案(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_HOST
变量开始,该变量仅包含传入URL(example.com
)的域名部分.假设域名不包含a www.
并且与您的域名完全匹配,则RewriteRule开始起作用.该模式^(.*)$
将匹配其中的所有内容REQUEST_URI
,即HTTP请求(foo/blah/index.html
)中请求的资源.它将它存储在后引用中,然后用于使用新域名(以域名开头www
)重写URL .
[NC]
表示不区分大小写的模式匹配,[R=301]
表示使用代码301的外部重定向(资源永久移动),并[L]
停止所有进一步的重写,并立即重定向.
非www => www和对面www =>非www的重定向代码..htaccess文件中没有硬编码域和方案.因此将保留原始域和http/https版本.
非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.
非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} !^www.*$ [NC] RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
我需要在新服务器上对25个以上的域进行通用,因此该指令位于
我不得不对重写规则进行一些修改,因为完整的docroot正在进行模式匹配,尽管http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html说关于它只是主机和端口之后的东西.