Вопрос или проблема
У нас есть один сайт на NextJs, с помощью next export мы получаем одну папку out, которую хотим обслуживать через Nginx. В out/login есть файл ‘[[…parameter]].html’. Когда мы развертываем сайт с помощью pm2, он работает, если мы обращаемся по URL “serverIP:port/login/programID/applicant”.
Но при обслуживании через nginx он не работает.
Ниже содержимое конфигурационного файла nginx:
server{
listen 7001;
server_name server_ip;
root /var/www/html/out/;
location / {
try_files $uri $uri.html $uri.html/ =404;
}
}
Пожалуйста, помогите. Я новичок в nginx и испытываю некоторые трудности.
Строка запроса относится к GET параметрам, которые вы предоставляете после URL, например, ?name=foo
. Думаю, вы хотите обслуживать файлы в каталоге, поскольку упоминаете “out folder which we want to serve from Nginx”.
В этом случае ваш пример должен работать нормально, но ваше правило try_files ожидает, что вы также укажете имя файла в URL.
Поэтому, когда вы запрашиваете GET www.mysite.com, Nginx пытается найти путь внутри каталога root
с такими именами как /
, .html
, .html/
или выдает ошибку 404. Путь .html/
относится к каталогу с именем .html
внутри вашего root и, вероятно, является ошибкой.
В случае, если у вас есть файл с именем index.html
в вашем указанном корневом каталоге, следующие запросы будут соответствовать ему:
GET www.mysite.com/index.html
(из-за$uri
)GET www.mysite.com/index
(из-за$uri.html
)
Возможно, вам нужно следующее:
location / {
root /var/www/html/out;
index index.html index.htm;
try_files $uri $uri/ =404;
}
Это делает следующее:
- Существует ли фактический файл, указанный $uri, в вашем корневом каталоге – тогда он будет обслужен.
- Существует ли путь к каталогу, указанный $uri, в вашем корневом каталоге?
- Если да, проверяется, содержит ли он файл с именем index.html или index.htm – тогда он будет обслужен.
- Ни одно из вышеуказанного, возвращается 404.
Так что GET www.mysite.com
попытается найти файл index.html
или index.htm
в вашем root.
В случае, если вы все же имеете в виду строки запроса, вы можете написать что-то вроде этого:
location / {
root /var/www/html/out;
try_files /$arg_file =404;
}
Тогда запрос типа GET www.mysite.com?file=index.html
будет искать файл index.html
в вашем корне. Nginx потрясающий, не правда ли?
Надеюсь, это поможет 🙂
Также прочитайте больше о try_files и Nginx Pitfalls and Common Mistakes.
Ответ или решение
Настройка Nginx для обработки параметров строки запроса: подробное руководство
Вы столкнулись с задачей настройки Nginx для раздачи статического сайта, сгенерированного с помощью Next.js, что вызывает некоторые трудности, особенно в контексте параметров строки запроса и обработки динамических маршрутов. Рассмотрим, как правильно настроить Nginx, чтобы решить вашу проблему.
Базовая Настройка Nginx для Next.js
Ваш конфигурационный файл Nginx, вероятно, имеет структуру, подобную приведенной ниже:
server {
listen 7001;
server_name server_ip;
root /var/www/html/out/;
location / {
try_files $uri $uri.html $uri/ =404;
}
}
Однако, данная настройка не учитывает динамические маршруты, такие как [[...parameter]].html
. Чтобы обработка таких запросов работала корректно, необходимо внести изменения в конфигурации.
Оптимизация конфигурации Nginx
- Использование try_files для поддержки динамических маршрутов
server {
listen 7001;
server_name server_ip;
root /var/www/html/out;
location / {
index index.html;
try_files $uri $uri.html /default.html =404;
}
}
В этом фрагменте конфигурации:
index index.html;
указывает на главный файл в корневой директории, если явно не указан другой файл.try_files $uri $uri.html /default.html =404;
пытается найти файл или директорию, соответствующую URI. Если файл не найден, будет возвращенdefault.html
или код ошибки 404, если и этот файл отсутствует.
- Обработка параметров строки запроса
Поскольку Nginx не обрабатывает параметры строки запроса напрямую для статических файлов, эти параметры могут остаться неиспользованными, если они не влияют на выбор файла. Однако, если параметр строки запроса необходим, например, file=index.html
, структура вашей конфигурации может выглядеть следующим образом:
location / {
root /var/www/html/out;
try_files /$arg_file /default.html =404;
}
Этот фрагмент конфигурации предполагает, что file=index.html
будет частью запроса, и Nginx будет искать файл index.html
внутри корневой папки.
Советы и Трюки
- Четко определите маршрут: Убедитесь, что структура вашего проекта и маршруты Nginx согласованы. Каждая ссылка на файл или папку в запросе должна соответствовать действительным маршрутам вашего проекта.
- Тестируйте конфигурацию: После внесения изменений в конфигурацию Nginx не забудьте проверить ее с помощью команды
nginx -t
, а затем перезапустить серверnginx
для применения изменений. - Используйте отладку: Если возникает ошибка, ознакомьтесь с логами Nginx, которые могут предоставить дополнительную информацию о проблемах с маршрутизацией.
Таким образом, эффективно настроив Nginx в соответствии с особыми требованиями вашего проекта, вы можете обеспечить корректную раздачу статического контента и обработку сложных маршрутов. Надеюсь, это руководство поможет вам в решении возникших проблем.