Назад | Перейти на главную страницу

Взаимосвязь ServerName, ServerAlias, host.file и их определение в httpd-vhosts.conf

Интересно, как связаны ServerName и ServerAlias ​​с host.file. Насколько я знаю, ServerName устанавливает имя хоста и порт, которые сервер использует для идентификации себя, а ServerAlias ​​- это альтернативные имена для хоста. Но нужно ли указывать ServerName и ServerAlias ​​в host.file? Нужно ли указывать точное доменное имя или это может быть альтернативное имя в ServerName или ServerAlias? Допустим, мой фактический домен - www.example.com, я настроил SSL, и мой веб-сайт теперь работает как https + www.example.com, теперь я пытаюсь перенаправить свой веб-сайт с http + example.com, когда я набираю его в браузере, и я ожидаю, что мой браузер перенаправит меня на https + www.example.com, какое ServerName или ServerAlias ​​мне следует указать в httpd-vhost.conf? Ниже мой 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>

Правильно ли мое определение ServerName и ServerAlias ​​в httpd-vhosts.conf? Это то, что я вставил в .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]

Я обновляю свой ServerName в vhost до 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

Пожалуйста, помогите и укажите мне, если я сделал что-то не так, и заранее спасибо!

Хост-файл (и как это не связано)

Во-первых, вам ничего не нужно в вашем hosts файл, если авторитетный DNS для example.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) для HTTPS без www:

<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 файлы в первую очередь, что делает вашу конфигурацию простой и эффективной.