Интересно, как связаны 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-адреса, но на самом деле вы все равно редко используете веб-сайт с сервера.
На самом деле не имеет значения, соответствует ли имя хоста Host
заголовок находится в ServerName
или ServerAlias
; с ними обращаются одинаково. Просто у вас ДОЛЖНО быть одно имя хоста в качестве ServerName
и список других имен хостов в ServerAlias
.
Вашему виртуальному хосту 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
файлы в первую очередь, что делает вашу конфигурацию простой и эффективной.