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会自动保留任何内容,这是一个常见的错误概念,说明为什么这个方法不起作用(事实上它确实如此).
小智 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)
che*_*vim 44
<VirtualHost *:80>
ServerAlias example.com
RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
小智 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
.
小智 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
这类似于许多其他一些增强功能的建议:
%{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)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]
停止所有进一步的重写,并立即重定向.
如果您使用的是 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)
非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]
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.
非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说关于它只是主机和端口之后的东西.