更新

更新

我想知道 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 调试器获得的信息:

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首先使用文件,这使得您的配置既简单又高效。

相关内容