разве это не означает, что Вы смогли бы скопировать его где-то в другом месте, таким образом позволив Вам выполнить его так или иначе?
Нет, это не корректно.
Существуют сценарии, когда Вы не можете выполнить файл, даже если он имеет исполняемый набор битов. Вот по крайней мере два из них:
Я думаю, что что-то в этом роде должно работать:
set $primary_domain "xxx.example.com";
if ($host != $primary_domain) {
rewrite ^ $scheme://$primary_domain permanent;
}
Самый эффективный и чистый способ сделать это - настроить два отдельных блока {} сервера: один для перенаправления, а другой (с каноническим именем) для фактической обработки запросов.
Пример конфигурация:
server {
listen 80;
listen 443 ssl;
server_name xxx yyy.example.com $hostname;
ssl_certificate ...
ssl_certificate_key ...
return 302 $scheme://xxx.example.com$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name xxx.example.com;
ssl_certificate ...
ssl_certificate_key ...
...
}
Документация:
Вот вариант ансера Брентона Алкера, использующий переменную $ server_name
для повторного использования значения директивы server_name
.
server_name primary.tld secondary.tld;
if ($host != $server_name) {
rewrite ^ $scheme://$server_name permanent;
}
Или, чтобы сохранить любые параметры запроса:
server_name primary.tld secondary.tld;
if ($host != $server_name) {
rewrite ^/(.*) $scheme://$server_name/$1 permanent;
}
Здесь $ server_name
относится к имени основного сервера, которое является первым именем в директиве server_name
, а $ host
относится к имени хоста, указанному в HTTP-запросе.
Обратите внимание, что оператор if
в конфигурации nginx не всегда делает то, что вы ожидаете, и некоторые не одобряют его использование. См. Также https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/