apache向非www www
-
11-09-2019 - |
题
我有一个网站,似乎并没有重定向非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}
规则。 路径部分不受影响通过以前
RewriteRule
s喜欢%{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。***无需再次请求服务器。
<强>因此只需使用Redirect
强>
<VirtualHost *:80>
ServerName example.com
Redirect / http://www.example.com/
</VirtualHost>
我刚刚有同样的问题。 但与此解决
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
以及
如果你不这样做,阿帕奇不允许本身使用不同的ServerName
s区分块,所以你得到这个错误信息:
[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虚拟主机。