Apache 网络服务器:如何将所有对 domain.com 的请求重定向到 www.domain.com

Apache 网络服务器:如何将所有对 domain.com 的请求重定向到 www.domain.com

对于索引页来说,类似这样的工作:

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

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

因此像这样的 URL:

http://example.com gets forwarded to 
http://www.example.com

但这不起作用:

http://example.com/robots.txt

我也在 .htaccess 中尝试了以下操作,结果相同:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=permanent,L]

请帮我解决这个问题。

完整配置:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

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

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

ProxyPass / balancer://example/ stickysession=JSESSIONID|jsessionid
ProxyPassReverse / balancer://example/ stickysession=JSESSIONID|jsessionid
ProxyPreserveHost On

<Proxy balancer://example>
BalancerMember http://host1.example.com:8080/ route=tomcat1
BalancerMember http://host2.example.com:8080/ route=tomcat2
</Proxy>
</VirtualHost>

robots.txt 位于每个 tomcat 服务器上。

答案1

我总是使用否定模式,所以任何事物与虚拟主机匹配,但与规范地址不匹配,将被重定向。

RewriteCond %{HTTP_HOST} !^www.example.com [nocase]
RewriteRule ^/(.*)$ http://www.example.com/$1 [redirect=permanent,nocase,last]

这样做的好处是,可以使用无限数量的ServerAlias指令(例如 *.example.net、*.example.org、*.example.asia 等)将所有指令正确重定向到 www.example.com)

答案2

我个人一直认为一个简单的 301 重定向就足以达到此目的:

<VirtualHost *:80>
    ServerName  oakalleyit.com
    Redirect    301 /   http://www.oakalleyit.com/
</VirtualHost>

它简单、易读/易记,并且能正确完成工作。

这实际上是从我的生产网络服务器复制而来的,所以我知道它可以工作。

这里有关于 Apache 重定向的文档:http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect

我刚刚测试了一下,输入http://oakalleyit.com/用户正确重定向至http://www.oakalleyit.com/用户

答案3

这对我来说一直很有效:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.example.co.uk/$1 [R=301,L]

我认为您可能遗漏了条件中的 $?

更多信息可以在这里找到: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html http://httpd.apache.org/docs/current/mod/mod_rewrite.html

答案4

Apache 文档页面使用 mod_rewrite 进行重定向和重新映射说:

规范主机名

描述:此规则的目的是强制使用特定主机名,而不是可用于访问同一站点的其他主机名。例如,如果您希望强制使用www.example.com代替例如.com,您可以使用以下配方的变体。

解决方案:

解决这个问题的最好方法根本不涉及 mod_rewrite,而是使用Redirect放置在虚拟主机中用于非规范主机名的指令。

<VirtualHost *:80>
  ServerName undesired.example.com
  ServerAlias example.com notthis.example.com
  Redirect "/" "http://www.example.com/"
</VirtualHost>

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

您也可以使用以下<If>指令来实现此目的:

<If "%{HTTP_HOST} != 'www.example.com'">
  Redirect "/" "http://www.example.com/"
</If>

相关内容