Nginx Laravel配置返回403

时间:2018-10-31 04:01:50

标签: php laravel nginx

我已经在VPS上建立了一个新的Laravel 5.7网站。我以前曾经使用valet在本地运行该站点,没有任何问题。但是,现在当我使用dashboard导航到https://mysite.mydomain.net/dashboard路线时,我收到了nginx返回的403错误(没有laravel错误,因此我假设它永远不会到达laravel)。

击中其他结构相似的其他路径的路径似乎没有受到影响。

我尝试运行php artisan route:clear,以确保它没有达到较早的缓存路由。

路线很简单:

Route::get('/dashboard', function () {
    return "yo";
})->name('dashboard'); // returns 403

几乎完全相同的路由可以毫无问题地返回预期结果:

Route::get('/test', function() {
    return "test";
})->name('test'); // returns "test"

这是nginx的配置:

server {

         # Log files for Debugging
         access_log /var/log/nginx/laravel-access.log;
         error_log /var/log/nginx/laravel-error.log;

         # Webroot Directory for Laravel project
         root /var/www/mysite/public;
         index index.php index.html index.htm;

         # Your Domain Name
         server_name mysite.mydomain.net;

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

         # PHP-FPM Configuration Nginx
         location ~ \.php$ {
                 try_files $uri =404;
                 fastcgi_split_path_info ^(.+\.php)(/.+)$;
                 fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
                 fastcgi_index index.php;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                 include fastcgi_params;
         }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysite.mydomain.net/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite.mydomain.net/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 = mysite.mydomain.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


         listen 80;
         listen [::]:80 ipv6only=on;
         server_name mysite.mydomain.net;
    return 404; # managed by Certbot


}

laravel身份验证会引发nginx 403错误吗?我希望它至少会显示laravel错误消息-而且,此路由上没有中间件。可能会发生什么?

nginx错误日志显示:

2018/10/30 20:46:48 [error] 19626#19626: *2201 directory index of "/var/www/mysite/public/dashboard/" is forbidden, client: 98.146.255.247, server: mysite.mydomain.net, request: "GET /dashboard/ HTTP/1.1", host: "rem$

2 个答案:

答案 0 :(得分:1)

听起来像您的网站根目录中有一个名为dashboard的文件夹。

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

由于nginx尝试以$ uri /

的形式提供内容,因此无法调用php

作为快速解决方案,您可以在此行中删除$ uri /

try_files $uri /index.php?$query_string;

但是,最好不要让您的应用程序成为网站根目录,以免造成混淆。 您可以将css等...放在文件夹/ assets中,并将行更改为

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

或类似的东西

location /assets {
    try_files $uri $uri/ =404;
}

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

别忘了(在其他重要位置,因为订单重要)

# protect hidden files/folders ex: .git
location ~ /\. {
    deny all;
}

答案 1 :(得分:0)

尝试php artisan cache:clear


我实际上经历了同样的事情。足够奇怪的是,我通过在dd( 'Blah' );(routes文件)的顶部写入了web.php,以某种方式“弄乱”了错误。完成此操作后,我将dd行下移了两行(每次移动有问题的URL时都会加载它)。最后,dd( 'Blah' )位于文件的底部,并且我的所有路由都有效(因此,必须必须是某种形式的缓存)。在执行此操作之前,我也曾尝试清除缓存。 ...我不知道它为什么起作用。但是确实如此。在执行此操作之前,我有45分钟的错误。

如果那没有帮助,那么也许检查/var/log/nginx/laravel-error.log;的内容(如您在Nginx配置中所写)。

如果这样做没有帮助,请尝试暂时将路由从/dashboard更改为/newdashboard,以查看错误是否随之而来。 ...或者,您可以尝试复制/test路由并将其重命名,以查看是否可行。 ...或者您可以更改路线的顺序。

我还遇到了另一个类似的问题,这似乎是一个中间件问题,但是那是很久以前的事了。我只是提到它,所以您有几个地方可以检查。

但是我看不出您编写的内容有什么问题。因此,我将把钱花在路由的顺序上,或者-在服务器上运行的其他东西占用该URL。