尝试将非 www 重定向到 www 时出现 err_too_many_redirects

尝试将非 www 重定向到 www 时出现 err_too_many_redirects

virtuahost apache conf 文件内部/etc/apache2/sites-available/000-default.conf

我尝试将这些代码放入 apache conf 文件中。

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

我也试过了。

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

也做了這個。

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

答案1

要解决您的问题,您必须了解“NameVirtualHosting”的概念以及 Ubuntu 部署 apache 网络服务的特殊方式。

名称虚拟主机

您的(本地)Apache Web 服务器可以在同一个地址上为不同的网站提供服务,只要它们的“名称”不同即可。Web 服务器会尝试将主机名(例如 example.com)与您 Apache 配置中的相应ServernameServerAlias指令进行匹配。对于每个“网站”,您需要<VirtualHost>在配置中为它们设置一个单独的容器;就您而言,您需要为 example.com 设置一个容器,为 www.example.com 设置另一个容器。

Apache Web 服务器和 Ubuntu

Ubuntu apache2 服务器包确实改变了默认的二进制文件、配置文件和目录:

  • Apache Webserver 二进制文件是/usr/sbin/apache2
  • 服务器根目录是/etc/apache2
  • 主要配置是/etc/apache2/apache2.conf
  • 其他服务器配置请转到/etc/apache2/conf.d
  • 模块配置位于/etc/apache2/mods-available/
  • VirtualHost 站点配置在/etc/apache2/sites-available/

到目前为止,一切都很简单;现在到了棘手的部分(对我来说):使用 Ubuntu,您可以使用四个命令来启用/禁用模块和(!)VirtualHosts 配置:

  • a2ensite / a2dissite
  • a2enmod / a2dismod

使用这些命令,您可以启用在 中配置的实际网站/etc/apache2/sites-available/。至少有一个默认虚拟主机配置default.conf,当通过 启用时,a2ensite default它将链接为sites-enabled/000.default.conf

这一切都有效,因为主配置apache2.conf包含此 Include 指令:

Include sites-enabled/

让我们实际一点:

删除所有符号链接sites-enabled/,如果您碰巧存储了实际的配置文件,请将sites-enabled/其移动到sites-available(注意不要覆盖现有文件,而是sites-available/重命名旧文件)。

现在,您在 sites-available/ 中创建两个新的虚拟主机文件:

vi /etc/apache2/sites-available/0_www.example.com
<VirtualHost *:80>
    ServerName www.example.com

    DocumentRoot /var/www
    DirectoryIndex index-www.html
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error-www-example-com.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access-www-example-com.log combined
</VirtualHost>

vi sites-available/1_example.com 
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName example.com

    ErrorLog ${APACHE_LOG_DIR}/error-example-com.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access-example-com.log combined

    RewriteEngine On
    RewriteRule ^/(.*) http://www.example.com/$1 [R=302]
</VirtualHost>

并启用它们,脚本将创建从sites-available/到 的符号链接sites-enabled/

sudo a2ensite 0_www.example.com

sudo a2enmod rewrite

sudo a2ensite 1_example.com

(重新启动 apache2 服务 -service apache2 restartsystemctl restart apache2

ls -l sites-enabled/
total 0
lrwxrwxrwx 1 root root 30 Jan  8 17:59 example.com -> ../sites-available/example.com
lrwxrwxrwx 1 root root 34 Jan  8 17:52 www.example.com -> ../sites-available/www.example.com

我们需要简单的索引页

# cat /var/www/index-non.html
<html><body><h1>example.com</h1>
This is the NON-www index page
</body></html>
# cat /var/www/index-www.html
<html><body><h1>www.example.com</h1>
This is the www.example.com index page.
</body></html>

请记住,<VirtualHost >apache 网络服务器遇到的第一个指令将是默认的 Web 容器,因此指令的顺序VirtualHost很重要;在我们的例子中,如果我调用没有特定主机名或未配置主机名的网络服务器,我将获得 www-index 的服务,因为它是第一个 virthost 指令。

# No Hostname given
curl http://127.0.0.1/ 
<html><body><h1>www.example.com</h1>
This is the www.example.com index page.
</body></html>

# index-www
curl -H "Host: www.example.com" http://127.0.0.1/ 
<html><body><h1>www.example.com</h1>
This is the www.example.com index page.
</body></html>

# non-www index
curl -H "Host: example.com" http://127.0.0.1/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.22 (Ubuntu) Server at example.com Port 80</address>
</body></html>

(请注意主机头变量 -H 的使用)

需要记住的是,为了使 NameVirtualHosting 正常工作,必须正确配置 Web 服务器和 Web 客户端。

我希望我的说明能够帮助您解决问题。

相关内容