docker无法为laravel加载样式表

时间:2018-04-10 12:07:44

标签: laravel docker nginx

我创建了一个非常小而简单的docker-compose用于laravel的小测试。关于一切工作除此之外我无法加载我的样式表。它在代客服务中完美地运作。

这是我的docker-compose

version: '2'
services:
    web:
        build:
            context: ./
            dockerfile: ./dockerfiles/web.docker
        ports:
            - 8080:80
            - 9090:8080
       links:
            - app
            - mariadb
    app:
        build:
             context: ./
            dockerfile: ./dockerfiles/app.docker
        volumes:
            - ~/workbench/laravel/testproject:/var/www/testproject
        depends_on:
          - mariadb
    mariadb:
        image: mariadb:10.2
        environment:
            MYSQL_ROOT_PASSWORD: toor
            MYSQL_DATABASE: testproject
            TEST_DB_NAME: laravel_test
            MYSQL_USER: laravel
            MYSQL_PASSWORD: laravel
            MARIADB_DATABASE: testproject
        volumes:
            - ./mariadb:/var/mariadb
        ports:
            - 33061:3306

这是我的nhostx vhost

server {
listen 80;
index index.php;
root /var/www/testproject/public;

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

我可以访问我的所有路线,功能似乎工作得很好,只是我的javascript,图片或样式表都没有加载。 例如,我尝试从模板中加载引导程序,如下所示:

<link rel="stylesheet" href="/homer/vendor/bootstrap/dist/css/bootstrap.css" />

在我的公共文件夹中,我有整个目录/public/homer/vendor/bootstrap/dist/css/bootstrap.css,该文件位于正确的目录中。

我是否遗漏了我必须在vhost中做的事情,以确保这些文件可以正常加载?

我试过编辑

的路径
<link rel="stylesheet" href="/homer/vendor/bootstrap/dist/css/bootstrap.css" />

<link rel="stylesheet" href="public/homer/vendor/bootstrap/dist/css/bootstrap.css" />

以及任何形式的公众。

  • /公共/
  • public
  • ../../../../公共

但似乎没有效果。我也不必改变这一点,所以我的路径可以在docker和valet之间保持不变。

3 个答案:

答案 0 :(得分:1)

显然我必须将索引server.php添加到我的vhost.conf中,所以它看起来如下:

server {
listen 80;
index index.php server.php;
root /var/www/testproject/public;

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

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

但是我仍然不确定这是如何工作的,因为我在没有index.php的公共文件夹中设置了root。 server.php只加载index.php,我在这里错过了关于nginx索引如何工作的内容吗?

答案 1 :(得分:1)

这是一个古老的问题,但是今天我遇到了同样的问题,并通过向 web 服务添加相同的volumes选项来解决此问题。之后,nginx可以查找 public 目录,并在该目录中找到所有资产文件。

volumes:
    - ~/workbench/laravel/testproject:/var/www/testproject

如果您未在 web 服务中提供卷选项,则docker不会将文件映射到容器,并且/var/www/testproject目录中将没有文件,因此找不到文件。

>

答案 2 :(得分:0)

尝试使用Laravel的内置asset()方法,该方法会自动将主机预先添加到public文件夹中。

<link rel="stylesheet" href="{{ asset('/bootstrap/dist/css/bootstrap.css') }}" />

注意:您可能必须使用Mix将bootstrap文件夹移入  public目录,或者自己动手。