Что означает ошибка 304 при переносе проекта на сервер с NGINX?

Привет всем! <br/> У нас есть два приложения на Angular, которые запускаются на одном сервере: одно в корневом каталоге, а второе в подкаталоге. <br/> <br/> Мы используем общий файл конфигурации nginx (nginx.conf), который выглядит следующим образом: <br/> <pre><code>server {
    listen 80;

    # Docker DNS
    resolver 127.0.0.11;

    location / {
        # hack to prevent nginx to resolve container's host on start up
        set $docker_host "project-1";
        proxy_pass http://$docker_host:4000;
    }
    
    location /project2 {
        # hack to prevent nginx to resolve container's host on start up
        set $docker_host "project-2";
        proxy_pass http://$docker_host:4000;
    }
}</code></pre> <br/> <br/> Первое приложение работает нормально, тогда как для второго возникает ошибка в консоли: скрипты не загружаются и выдает ошибку по всем запросам с кодом 304. <pre><code>Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec.</code></pre> <br/> <br/> Любопытно, что при изменении местами проектов, то есть перемещении второго в корень и первого в подкаталог, второе приложение начинает работать, в то время как первое выдает ту же ошибку. <br/> <br/> Оба приложения работают через docker compose на порту 4000 с типичными настройками. <br/> <br/> <pre><code>FROM node:20-alpine as angular-build
WORKDIR /app
RUN mkdir -p /app
COPY ./ /app
RUN npm install
RUN npm run build
RUN npm run compress

FROM node:20-alpine as ssr-build
WORKDIR /dist
RUN mkdir -p /dist
COPY --from=angular-build /app/dist /dist
EXPOSE 4000
CMD ["node", "/dist/project/server/server.mjs" ]</code></pre>
  • 23 марта 2025 г. 4:54
Ответы на вопрос 2
Ошибка 304 (Not Modified) означает, что запрашиваемый ресурс не изменился с момента последнего запроса. Однако в вашем случае, судя по описанию, при получении этого кода ошибки браузер ожидает получить JavaScript файл, но вместо этого получает HTML (например, страницу ошибки 404 или домашнюю страницу). Это вызвано тем, что NGINX не может правильно отдать скрипт JavaScript по указанному пути для вашего второго приложения.

Скорее всего, проблема заключается в конфигурации NGINX, а точнее — в том, как вы обрабатываете запросы к подкаталогу `/project2`. Когда ваш браузер пытается получить ресурс (например, скрипт), он обращается к `/project2/...`, но из-за неправильной конфигурации nginx может неверно перенаправлять запросы.

Чтобы решить эту проблему, проверьте следующие моменты:

1. **Проверьте, что у вас есть правильное определение префикса пути**. Для второго приложения вам нужно, чтобы NGINX также корректно обрабатывал пути для статических файлов. Попробуйте модифицировать ваше конфигурирование следующим образом:

    ```nginx
    server {
        listen 80;

        # Docker DNS
        resolver 127.0.0.11;

        location / {
            # Hack to prevent nginx from resolving container's host on startup
            set $docker_host "project-1";
            proxy_pass http://$docker_host:4000;
        }
        
        location /project2/ {
            # Hack to prevent nginx from resolving container's host on startup
            set $docker_host "project-2";
            proxy_pass http://$docker_host:4000;
            # Добавьте правило для обработки статических файлов:
            try_files $uri $uri/ /project2/index.html;
        }
    }
    ```

2. **Используйте `try_files`**. Это правило позволяет NGINX проверять, есть ли файл по запрашиваемому URI. Если файл не найден, он будет переслан на `index.html`, что необходимо для маршрутизации в одностраничных приложениях (SPA), таких как Angular.

3. **Проверьте настройки CORS и MIME**. Убедитесь, что сервер отдает правильные заголовки для JavaScript файлов. Например, MIME-тип для `.js` файлов должен быть `application/javascript`. Это можно также явно указать в блоке `location`.

4. **Логи**. Не забудьте проверить логи NGINX на наличие ошибок, которые могут дать больше информации о том, что происходит.

После внесения изменений не забудьте перезапустить NGINX, чтобы применить новую конфигурацию.
Для второго роута нужно в конце слеш указать, вопрос закрыт 

proxy_pass http://$docker_host:4000/;
Похожие вопросы