Answers:
使用重写引擎是解决此问题的非常重要的方法。这是一个更简单的解决方案:
<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
指令时,Apache会自动保留所有内容,这是一个常见的误解,说明该方法为何行不通(实际上是行得通)。
www.example
以及example
它们出现在样本中的任何位置。
Redirect 301 / http://example2.com/extra/
但是当它重定向时,它会丢失尾部的斜杠,即example.com/blah
转到example2.com/extrablah
。有任何想法吗?(Apache 2.2.22)
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]
example.com/subdi1/ws/*
没有www的情况如何?
s
在第三行中到http。
<VirtualHost *:80>
ServerAlias example.com
RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
www.
在中ServerAlias
?
要从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。
这里的顺序很重要。如果首先添加第二个virtualhost指令,它将导致重定向循环。
此解决方案会将任何请求重定向到您的域,即www.yourdomain.com。
干杯!
这与许多其他建议相似,但有一些改进:
%{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.
且与您的域名完全匹配,则RewriteRule起作用。该模式^(.*)$
将匹配中的所有内容REQUEST_URI
,这是HTTP请求(foo/blah/index.html
)中请求的资源。它将其存储在反向引用中,该反向引用随后用于使用新域名(以开头的域名)重写URL www
。
[NC]
表示不区分大小写的模式匹配,[R=301]
表示使用代码301的外部重定向(资源已永久移动),并[L]
停止所有进一步的重写,并立即进行重定向。
非www => www和相反www => non-www的重定向代码。.htaccess文件中没有硬编码域和方案。因此,将保留原始域和http / https版本。
非WWW => WWW:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
万维网=>非万维网:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]
注意:不适用于%{REQUEST_SCHEME}不可用的Apache 2.2。为了与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]
万维网=>非万维网:
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个以上的域,我需要具有通用性,因此此指令位于我的virtual.conf文件的<Directory>标记中。(目录是所有文档根目录的父目录)
尽管http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html说了什么,但是我还是要对重写规则做一点修改,因为完整的docroot都是通过模式匹配传递的关于它只是主机和端口之后的东西。
如果您使用的是Apache 2.4,则无需启用重写apache模块,则可以使用以下代码:
# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
Redirect 301 "/" "http://www.domain.com/"
</If>
可以在Apache指令或.htaccess文件中添加以下行:
RewriteEngine on
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
如果您修改了虚拟主机,请不要忘记应用apache更改。
(基于默认的Drupal7 .htaccess,但在许多情况下应该可以使用)
不要总是使用 Redirect permanent
(或为什么以后可能会引起问题)
如果您以后有机会添加子域,请不要使用 redirect permanent
。
因为如果客户使用了未注册为的子域 VirtualHost
即使以后再注册他也可能永远也不会到达该子域。
redirect permanent
发送一个 HTTP 301 Moved Permanently
客户端(浏览器),它们中的很多将永远缓存此响应(直到缓存被[手动]清除)。因此,使用该子域将始终自动重定向到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)
到www
子域时,我使用预见模式将子域排除在外,www
以避免Apache中出现无限重定向循环。
-如果您托管多个域名(可选)
-如果所有这些域名都使用https(应使用)
-如果您希望所有这些域名都使用www点domainName
这将避免双重重定向(从http://非www到http:// www,然后到https:// www)
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>
和
<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
您应该将重定向代码301更改为最方便的一种
如果使用<VirtualHost *:80>
具有不同ServerName
s 的两个块的上述解决方案...
<VirtualHost *:80>
ServerName example.com
Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
...那么你必须设置NameVirtualHost On
以及。
如果不这样做,Apache不允许其自身使用不同的ServerName
s来区分块,因此您将收到以下错误消息:
[warn] _default_ VirtualHost overlap on port 80, the first has precedence
...或者没有重定向发生,或者您有无限的重定向循环,具体取决于您首先放置的块。
我在WP Multisite上有一个类似的任务,其中重定向规则必须是通用的(对于要添加到网络的任何给定域)。我首先解决了将通配符添加到域(驻留域)的问题。注意。.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 vhosts。
.htaccess
基础解决方案,我建议针对直径问题提出一个答案:stackoverflow.com/a/5262044/367456