Nginx не может читать .php маршруты laravel, которые не существуют - PullRequest
0 голосов
/ 04 июля 2018

Я создал несколько маршрутов Laravel с расширением ".php", например

Route::get('/api/send.php', function(){
    echo 'Hi There';
});

Но когда я открываю маршрут, он показывает ошибку 404 на сервере Nginx ... То есть конфигурации Nginx

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/laravel/public;

    # Add index.php to the list if you are using PHP
    index index.php index.html index.htm index.nginx-debian.html;

    server_name xxx.xxx.xxx.xxx;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

В чем проблема? Я использовал тот же код, который работал раньше ..

Спасибо

решаемые

Решено путем изменения

try_files $fastcgi_script_name =404; 

в /etc/nginx/snippets/fastcgi-php.conf to

try_files $fastcgi_script_name /index.php?$query_string;

1 Ответ

0 голосов
/ 04 июля 2018

Это очень распространенная проблема с nginx, настроенным для обслуживания приложений PHP, особенно Laravel. Вы можете воспроизвести его на таких сайтах, как laravel.com, например: laravel.com/example.php.

Конфигурация по умолчанию (которую вы, вероятно, используете в snippets/fastcgi-php.conf) такова:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

А fastcgi_script_name является ...

запрос URI или, если URI заканчивается косой чертой, запрос URI с именем файла индекса, сконфигурированного директивой fastcgi_index, приложенной к нему. Эта переменная может использоваться для установки параметров SCRIPT_FILENAME и PATH_TRANSLATED, которые определяют имя сценария в PHP. Например, для запроса «/ info /» со следующими директивами

Это означает, что когда URI запроса содержит .php, он обрабатывается так, как если бы это был запрос на файл PHP, и если этот файл PHP не существует, nginx возвращает ошибку - он никогда не достигает вашего приложения .

Решение состоит в том, чтобы заставить fastcgi_script_name всегда равняться точке входа вашего приложения, в данном случае это index.php. Вы можете отредактировать snippets/fastcgi-php.conf или добавить его в свой блок местоположения следующим образом:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}

Ваше приложение теперь будет получать все запросы, включая те, которые имеют .php в пути.

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