Почему статика не обслуживается через Nginx в приложении Laravel?

У меня есть сервер с Docker-контейнерами, которые объединены в сеть. Между контейнером Nginx и бэкендом (php-fpm с приложением Laravel и админкой Orchid) установлено соединение через upstream.

Проблема заключается в следующем: 
- При обращении по адресу domain.com/index.php загружается стандартная заглушка Laravel без каких-либо проблем. 
- Однако при попытке доступа к domain.com/admin/backend отображается форма входа в админку Orchid, но без стилей. В инструменте DevTools Network для всех стилей указаны ошибки 404, хотя папки со стилями действительно находятся в корневом каталоге.

После авторизации в админке все работает, но по-прежнему без стилей. Я перепроверил все возможные настройки, но так и не смог определить причину проблемы.

Вот конфигурация Nginx: 
```nginx
server {
    listen 80;
    server_name  ${DOMAIN};
    root /var/www/api/public;
    index index.php;

    error_log /var/log/nginx/${DOMAIN}.error.log debug;
    access_log /var/log/nginx/${DOMAIN}.access.log combined buffer=256k flush=10s;

    location ~ ^/(api|docs|admin|vendor|css|aic|storage) {
        try_files $uri $uri/ /index.php?$query_string;
    }

    error_page 404 /index.php;

    location ~ \.php$ {
        client_max_body_size 1024m;

        fastcgi_pass php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```
Также прикладываю скриншот из DevTools.
  • 5 сентября 2024 г. 13:53
Ответы на вопрос 2
Проблема с тем, что стили не подгружаются на страницах вашего приложения Laravel, может быть вызвана несколькими аспектами конфигурации Nginx и структуры вашего приложения. Давайте разберемся.

1. **Проверка путей к ресурсам**: Убедитесь, что пути к стилям и скриптам указаны правильно в вашем Blade-шаблоне. Если у вас имеется относительный путь, он может не работать должным образом, и вам необходимо убедиться, что ресурсы загружаются по абсолютным URL.

2. **Конфигурация Nginx**:
   Может потребоваться изменить конфигурацию Nginx таким образом, чтобы статические ресурсы отдаваться без перенаправления на `index.php`. Попробуйте изменить секцию `location ~ ^/(api|docs|admin|vendor|css|aic|storage)` следующим образом:

   ```nginx
   location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
       try_files $uri $uri/ =404;
   }

   location / {
       try_files $uri $uri/ /index.php?$query_string;
   }
   ```

   В этом фрагменте кода добавлен отдельный блок для обработки статических файлов (CSS, JS и изображений), который будет пытаться найти и отдать файлы напрямую.

3. **Права доступа к директориям**: Проверьте, есть ли у Nginx права доступа к файлам и директориям вашего приложения. Неправильные разрешения могут привести к тому, что сервер не сможет отдать запрашиваемые файлы. Стандартно для хранилищ это может быть:
   ```bash
   sudo chmod -R 755 storage
   sudo chown -R www-data:www-data storage
   ```

4. **Использование кеширования**: Если вы используете кеширование на уровне браузера или на уровне сервера, возможно, проблема связана с кэшированными версиями ваших CSS и JS файлов. Проверьте с помощью инструментов разработчика, не кэшируются ли старые версии файлов.

5. **Ошибки в логах**: Обратитесь к логам ошибок Nginx (`/var/log/nginx/${DOMAIN}.error.log`) для получения дополнительной информации о том, почему ресурсы не могут быть загружены. Логи могут указать на определенные проблемы с правами доступа или ошибками маршрутизации.

После внесения этих изменений, обязательно перезапустите Nginx:
```bash
sudo service nginx restart
```
Также попробуйте сбросить кеш браузера, чтобы убедиться, что загружаются последние версии стилей и скриптов. 

Если что-то все еще не работает, попробуйте привязать более детальную проверку сетевых запросов в DevTools, чтобы увидеть, какие именно запросы не проходят.
php artisan orchid:publish
php artisan view:clear


Каталог vendor находится в пути, куда смотрит root (/var/www/api)

Файлы должны находится в публичке, в папке public
Похожие вопросы