Конфигурация Nginx Laravel, возвращающая 403 - PullRequest
0 голосов
/ 31 октября 2018

Я установил новый сайт Laravel 5.7 на VPS. Ранее я запускал сайт локально, используя 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 выдает ошибку 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 голосов
/ 31 октября 2018

звучит так, как будто у вас есть папка с именем dashboard в корне вашего сайта.

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

не может вызвать php, поскольку nginx пытается обслужить контент в $ uri /

В качестве быстрого решения вы можете избавиться от $ 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;
}
0 голосов
/ 31 октября 2018

Попробуйте php artisan cache:clear.


Я действительно испытал то же самое. Достаточно странно, я как-то «массировал» ошибку, написав dd( 'Blah' ); вверху моего web.php (файл маршрутов). После этого я переместил строку dd на пару строк вниз (загружая проблемный URL-адрес каждый раз, когда перемещал его). В конце концов, dd( 'Blah' ) был внизу файла, - и все мои маршруты работали (так что должно быть каким-то кешированием). Я также пытался очистить кеш до этого. ... Я понятия не имею, почему это сработало. Но это так. У меня была ошибка в течение 45 минут, прежде чем я это сделал.

Если это не поможет, возможно, проверьте содержимое /var/log/nginx/laravel-error.log; (как вы пишете в конфигурации Nginx).

Если это не поможет, попробуйте временно изменить маршрут с /dashboard на /newdashboard, чтобы проверить, следует ли ошибка. ... Или вы можете попробовать скопировать /test -путь и переименовать его, чтобы посмотреть, сработает ли это. ... Или вы можете изменить порядок ваших маршрутов.

У меня также была другая проблема, подобная этой, которая, казалось, была проблемой промежуточного программного обеспечения, - но это было довольно давно. Я просто упоминаю об этом, так что у вас есть пара мест, чтобы проверить.

Но я не вижу ничего плохого в том, что вы написали. Поэтому я бы положил свои деньги на порядок маршрутов - или что-то еще, работающее на сервере, занимающее этот URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...