【发布时间】:2018-10-31 14:36:03
【问题描述】:
我在 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$
【问题讨论】:
-
听起来您的问题是您的站点根目录中确实有一个名为仪表板的文件夹。
try_files $uri $uri/ /index.php?$query_string;无法调用 php 并且 nginx 尝试在 $uri/ 中提供内容 -
你可以去掉
try_files $uri /index.php?$query_string;这一行中的 $uri/ 但是最好不要让你的应用程序成为站点根目录以避免这些混淆 -
@AntonyGibbs 是的,我有一个
public/dashboard来保存我的混合 css / js 等资产。 -
@AntonyGibbs - 有效,删除
$uri/解决了这个问题。请做出你的回答,我会接受的。谢谢!