我想知道 ServerName 和 ServerAlias 与 host.file 的关系是什么。据我所知,ServerName 设置服务器用来标识自身的主机名和端口,而 ServerAlias 是主机的备用名称。但是 ServerName 和 ServerAlias 是否需要在 host.file 中标识?我们需要在 ServerName 或 ServerAlias 中输入确切的域名还是可以使用备用名称?假设我的实际域名是 www.example.com,我已经设置了 SSL,我的网站现在以 https+www.example.com 的形式运行,现在,当我在浏览器中输入 http+example.com 时,我尝试将我的网站从 http+example.com 重定向,并且我希望浏览器将我重定向到 https+www.example.com,我应该在 httpd-vhost.conf 中输入什么 ServerName 或 ServerAlias?以下是我的 host.file:
127.0.0.1 example.com www.example.com
::1 example.com www.example.com
127.0.0.1 localhost
::1 localhost
以下是我的httpd-vhosts.conf:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "d:/wamp64/www/example"
<Directory "d:/wamp64/www/example/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Order allow,deny
Allow from all
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
</Directory>
</VirtualHost>
我在 httpd-vhosts.conf 中对 ServerName 和 ServerAlias 的定义是否正确?这是我在 .htacess 中输入的内容,用于将我的网站从 http+example.com 重定向到 https+ww.example.com,但它不起作用,我相信这与我对 ServerName 和 ServerAlias 的定义有关:
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]
以下是我的重定向日志的结果:
[perdir D:/wamp64/www/example/] RewriteCond: input='off' pattern='!on' => matched
[perdir D:/wamp64/www/example/] RewriteCond: input='' pattern='^example\\.com$' => not-matched
这是我从 Firefox 调试器获得的信息:
更新
我已将 .htaccess 更新如下:
RewriteCond %{HTTP_HOST} example.com [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]
我将 vhost 中的 ServerName 更新为 www.example.com 这是我收到的日志:
example per-dir prefix: D:/wamp64/www/example/index.php/news-and-events/news-and-events/news -> index.php/news-and-events/news-and-events/news
applying pattern '.*' to uri 'index.php/news-and-events/news-and-events/news'
RewriteCond: input='off' pattern='!on' => matched
RewriteCond: input='www.example.com' pattern='example.com' [NC] => matched
rewrite 'index.php/news-and-events/news-and-events/news' -> 'https://www.example.com/index.php/news-and-events/news-and-events/news'
explicitly forcing redirect with https://www.example.com/index.php/news-and-events/news-and-events/news
trying to replace prefix D:/wamp64/www/example/ with /
escaping https://www.example.com/index.php/news-and-events/news-and-events/news for redirect
redirect to https://www.example.com/index.php/news-and-events/news-and-events/news [REDIRECT/301]
以下是我从 Firefox 调试器原始标头中获得的信息:
GEThttp://example.com/
Request URL:http://example.com/
Request Method:GET
Request Headers (328 B)
Raw Headers
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
以下是我从 Microsoft Edge 获得的信息:
General
Request URL: http://example.com/
Referrer Policy: no-referrer-when-downgrade
Request Headers
Provisional headers are shown
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 Edg/80.0.361.111
如果我做错了什么,请帮助并指出我,提前谢谢!
答案1
主机文件 (及其不相关之处)
hosts
首先,如果权威 DNSexample.com
指向您服务器的公共 IP 地址,则您不需要在文件中添加任何内容。
127.0.0.1 example.com www.example.com
这只会在从同一台机器使用时覆盖 DNS example.com
。它使服务器使用本地环回而不是公共 IP,但实际上你很少从服务器使用网站。
ServerName 和 ServerAlias 的关系
Host
与标头匹配的主机名是在ServerName
还是中并不重要ServerAlias
;它们被视为相同。只是您必须有一个主机名作为 和ServerName
中其他主机名的列表ServerAlias
。
这是条件之一何时不使用 mod_rewrite
您的 HTTP 虚拟主机不需要具有任何文档根目录,也不必从 读取RewriteRule
,.htaccess
但您可以直接从<VirtualHost>
块重定向,优选地使用mod_alias而不是 mod_rewrite。
您的配置可以简短如下:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost>
httpd-ssl.conf
然后,您可以通过为非 www HTTPS添加单独的虚拟主机(在您的)来替换第二个重写条件:
<VirtualHost *:443>
ServerName example.com
# SSL cert/key headers here
# This is the correct place for HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Redirect permanent / https://www.example.com/
</VirtualHost>
现在您已经完全不再需要任何重写规则,而.htaccess
首先使用文件,这使得您的配置既简单又高效。