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 配置中的相应Servername
或ServerAlias
指令进行匹配。对于每个“网站”,您需要<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 restart
或systemctl 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 客户端。
我希望我的说明能够帮助您解决问题。