代码之家  ›  专栏  ›  技术社区  ›  user101289

Nginx Laravel config返回403

  •  0
  • user101289  · 技术社区  · 7 年前

    我在VPS上建立了一个新的Laravel5.7站点。我以前在本地使用 valet 没有问题。然而,现在当我导航到 dashboard 路由使用 https://mysite.mydomain.net/dashboard ,我得到一个 403 nginx返回的错误(没有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身份验证是否抛出nginx403错误?我希望它至少显示一个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 回复  |  直到 7 年前
        1
  •  4
  •   Antony Gibbs    7 年前

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

    当nginx试图在$uri中提供内容时,不能调用php/

    try_files $uri /index.php?$query_string;
    

    但最好不要让你的应用程序成为一个网站的根,以避免这些混淆。

    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;
    }
    
        2
  •  0
  •   Zeth    7 年前

    php artisan cache:clear


    我也经历过同样的事情。足够精巧的是,我不知何故“按摩”了错误,通过写作 dd( 'Blah' ); 在我的头上 web.php (路由文件)。做完后,我把箱子搬走了 dd dd( 'Blah' ) 在文件的底部,-我所有的路线都正常(所以 必须 是某种缓存)。在此之前,我也尝试过清除缓存。 ... 我不知道它为什么起作用。但它做到了。我犯了45分钟的错误,在我做这个之前。

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

    如果这没有帮助,那么试着改变路线 /dashboard /newdashboard 暂时,看看是否错误随之而来。 ... 或者你可以试着复制 /test -路由并将其重命名,以查看是否有效。

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

    但我看不出你写的有什么不对。所以我把钱放在路由的顺序上,-或者其他运行在服务器上的东西,占据这个URL。