Nginx-Laravel配置返回403



我在VPS上建立了一个新的Laravel 5.7站点。我以前使用valet在本地运行过该网站,没有任何问题。然而,现在当我使用https://mysite.mydomain.net/dashboard导航到我的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$

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

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

由于nginx试图在$uri/中提供内容,因此无法调用php

作为一个快速的解决方案,你可以去掉这行中的$uri/

try_files $uri /index.php?$query_string;

但最好不要让你的应用程序成为网站根,以避免这些混乱。你可以把css等放在文件夹/资产中,然后把行改为

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;
}

尝试php artisan cache:clear


我实际上也经历过同样的事情。我在web.php(路由文件(的顶部写了dd( 'Blah' );,以某种方式"消除"了错误。完成后,我将dd-行向下移动了几行(每次移动都加载有问题的URL(。最后,dd( 'Blah' )在文件的底部,我的所有路由都在工作(所以它一定是某种缓存(。在此之前,我也尝试过清除缓存。…我不知道为什么它有效。但它确实做到了。在我这么做之前,我有45分钟的错误。

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

如果这没有帮助,那么尝试将路由从/dashboard临时更改为/newdashboard,看看是否会出现错误。…或者,您可以尝试复制/test路由并重命名它,看看这是否有效。…或者您可以更改路线的顺序。

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

但我看不出你写的有什么不对。所以我会把钱放在路线的订单上,或者放在服务器上运行的其他东西上,占据那个URL。

最新更新