Каждый поддомен находится в отдельной папке. Я захватываю поддомен и устанавливаю корень в правильную папку с помощью этого кода:
server_name ~^(?<sub>.+)\.mysite\.com$;
root "/path/to/my/site/$sub";
Когда поддомен не существует, он выдает ошибку 404, но не использует мою страницу с ошибкой 404, потому что в качестве корня задан каталог, который не существует.
Я могу решить проблему с помощью этого кода:
server_name ~^(?<sub>.+)\.mysite\.com$;
if (!-d "/path/to/my/site/$sub") {
set $sub www;
#set $sub "";
}
root "/path/to/my/site/$sub";
но очевидно, что это неправильно, потому что если зло, или я нашел исключение, когда с моей стороны правильно использовать if
.
Возникла проблема с кодом моей страницы с ошибкой. Теперь это работает, что позволило мне исправить другую проблему (php без расширения с перенаправлениями).
error_page 404 =200 /404.php;
location = /404 {
#root "/path/to/404/page";
}
Пробовал ставить рут внутри location = /404
но это не работает. Я не нашел способа избежать if
заявление и все равно заставить его работать правильно.
if (!-d "/path/to/my/site/$sub") {
return 301 https://www.example.com$request_uri;
}
Я думаю, лучше иметь очень небольшое количество if
заявления о редиректах, чем иметь неработающий сайт.
Даже автоматически сгенерированный код Plesk Onyx использовал if
заявление:
if ($host ~* ^example\.com$) {
return 301 https://www.$host$request_uri;
}
Однако я все же предпочел бы избегать if
в целом, если я смогу заставить мой сайт работать на 100% правильно без них.