Laravel + NGINX 给 403 禁止

Posted

技术标签:

【中文标题】Laravel + NGINX 给 403 禁止【英文标题】:Laravel + NGINX giving 403 forbidden 【发布时间】:2019-01-23 12:35:20 【问题描述】:

我第一次在 Web (EC2) 上加载 Laravel 应用程序时真的卡住了。

我有一个运行最新 laravel 5.6 的 Ubuntu 18.04 实例。我被困了好几个小时试图解决 403 问题。我关注了:

These steps(创建新组,添加ubuntu和www-data,设置组和所有者读取、写入和执行)

These steps 设置文件夹权限

...许多其他尝试/服务器重建...

所以刚才我将root中的所有文件和文件夹设置为777进行测试

$ find /home/ubuntu/projectname -type f -exec chmod 777  \;
$ find /home/ubuntu/projectname -type d -exec chmod 777  \;

根据下面的建议,我也这样做了:

$ namei -l /home/ubuntu/projectname/public
f: /home/ubuntu/projectname/public
drwxr-xr-x root     root     /
drwxr-xr-x root     root     home
drwxr-xr-x ubuntu   ubuntu   ubuntu
drwxrwxrwx www-data www-data projectname
drwxrwxrwx www-data www-data public

$ sudo chmod -R 777 /home/ubuntu/projectname

$ ls -l
drwxrwxrwx   8 www-data www-data   4096 Aug 16 10:25 app
-rwxrwxrwx   1 www-data www-data   1686 Aug 16 10:25 artisan
drwxrwxrwx   3 www-data www-data   4096 Aug 16 10:25 bootstrap
-rwxrwxrwx   1 www-data www-data   1652 Aug 16 10:25 composer.json
-rwxrwxrwx   1 www-data www-data 166078 Aug 16 10:25 composer.lock
drwxrwxrwx   2 www-data www-data   4096 Aug 16 10:25 config
drwxrwxrwx   5 www-data www-data   4096 Aug 16 10:25 database
drwxrwxrwx 999 www-data www-data  36864 Aug 16 10:46 node_modules
-rwxrwxrwx   1 www-data www-data   1442 Aug 16 10:25 package.json
-rwxrwxrwx   1 www-data www-data 604905 Aug 16 10:45 package-lock.json
-rwxrwxrwx   1 www-data www-data   1134 Aug 16 10:25 phpunit.xml
drwxrwxrwx   6 www-data www-data   4096 Aug 16 10:46 public
-rwxrwxrwx   1 www-data www-data   3675 Aug 16 10:25 readme.md
drwxrwxrwx   6 www-data www-data   4096 Aug 16 10:25 resources
drwxrwxrwx   2 www-data www-data   4096 Aug 16 10:25 routes
-rwxrwxrwx   1 www-data www-data    563 Aug 16 10:25 server.php
drwxrwxrwx   6 www-data www-data   4096 Aug 16 10:25 storage
drwxrwxrwx   4 www-data www-data   4096 Aug 16 10:25 tests
drwxrwxrwx  45 www-data www-data   4096 Aug 16 10:45 vendor
-rwxrwxrwx   1 www-data www-data   1738 Aug 16 10:25 webpack.mix.js

最后一个让我很难过,因为我的 nginx 项目错误日志 (tail -f) 中的结果是一样的:

2018/08/16 13:44:25 [error] 27246#27246: *1 directory index of "/home/ubuntu/projectname/public/" is forbidden, client: 29.99.0.232, server: projectname.com.au, request: "GET / HTTP/1.1", host: "projectname.com.au"

我不知道下一步该尝试什么。 任何帮助都会让你进入我的圣诞贺卡清单!

我的项目被克隆到:

/home/ubuntu/projectname

我的 nginx 配置(取自 Laravel's Deploy page)是:

server 
    listen 80;

    server_name projectname.com.au www.projectname.com.au;
    root /home/ubuntu/projectname/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

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

    location = /favicon.ico  access_log off; log_not_found off; 
    location = /robots.txt   access_log off; log_not_found off; 

    error_page 404 /index.php;

    access_log  /var/log/nginx/projectname.access.log;
    error_log  /var/log/nginx/projectname.error.log error;

    location ~ \.php$ 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    

    location ~ /\.(?!well-known).* 
        deny all;
    

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/projectname.com.au/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/projectname.com.au/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot




server 
    if ($host = www.projectname.com.au) 
        return 301 https://$host$request_uri;
     # managed by Certbot


    if ($host = projectname.com.au) 
        return 301 https://$host$request_uri;
     # managed by Certbot


        listen 80;
        server_name projectname.com.au www.projectname.com.au;
    return 404; # managed by Certbot

【问题讨论】:

只是为了确定一下,你能试试运行chmod -R 777 /home/ubuntu/projectname 嗨@Chris。运行chmod 后,我刚刚更新了我的问题。仍然是相同的 403 结果。 projectname.error.log 中的相同消息 文件夹不应该是 777,有些安装的 nginx 实际上可能会卡住。您的公用文件夹中有 index.php 吗?它试图显示目录索引而不是自动加载索引文件这一事实意味着某些内容丢失或配置错误。 你至少可以像/robots.txt一样访问public中的静态文件吗? 哇!时间浪费在 gitignore 文件中的一个愚蠢的条目上......我的 index.php 被排除在 repo 之外,所以它没有进入服务器!谢谢@aynber,你通过问一个最明显的问题为我找到了它! 【参考方案1】:

尝试在 Nginx 配置中更改此行:

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

到这里:

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

据我所知,这是因为 nginx 会尝试索引目录,并被自己阻止。

来源答案:Nginx 403 error: directory index of [folder] is forbidden

【讨论】:

嗨@chris,所以现在禁止已经消失了,但是提供了一个空白页面。 proj.error.log 中没有错误,laravel.log 中没有错误,并且我可以在 proj.access.log 中看到一个 GET 请求。 嗨 Tobias,我的空白页面正在使用 HTTP 200。Laravel 日志 proj.error.log 中没有任何内容 我很困惑,我认为根据您的 index.php 在 gitignore 中的评论解决了您的问题?你还有那个空白页吗? 完美运行。拯救了我的一天!【参考方案2】:

在根目录路径的其他地方可能存在 nginx 权限问题。

运行namei -l /home/ubuntu/projectname/public 并确保每个目录都至少对 nginx 用户具有执行权限。

【讨论】:

嗨@Balázs Sárközi,这是输出,是的,nginx 有执行权(除非我误解了?)。我将结果添加到我的问题中

以上是关于Laravel + NGINX 给 403 禁止的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 403 禁止错误

LARAVEL - JQuery AJAX 403 禁止

Laravel 5.6 DELETE 和 PUT 403 访问被禁止

API:Laravel 中的 Ajax 帖子 - 403(禁止)

nginx + 乘客 + rails - 403 禁止错误

nginx 403 禁止错误