我在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。