Laravel: Как разрешить маршруты с расширением .php - PullRequest
1 голос
/ 21 марта 2019

Я использую hometead (поэтому я имею дело с Nginx) и хочу сопоставить некоторые маршруты, которые могут содержать «.php». Мой конфигурационный файл nginx:

server {
listen 80;
listen 443 ssl http2;
server_name .homestead.test;
root "/home/vagrant/code/test/public";

index index.html index.htm index.php;

charset utf-8;

location / {
    try_files $uri $uri/ /index.php?$query_string;
    add_header 0 false;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

access_log off;
error_log  /var/log/nginx/homestead.test-error.log error;

sendfile off;

client_max_body_size 100m;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;


    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    }

location ~ /\.ht {
    deny all;
}

ssl_certificate     /etc/nginx/ssl/homestead.test.crt;
ssl_certificate_key /etc/nginx/ssl/homestead.test.key;
}

Полагаю, и надеюсь, что это связано с настройкой nginx. потому что я следовал этому решению https://laracasts.com/discuss/channels/general-discussion/routes-with-php-file-extensions, и у меня почти получилось, что оно работает, но не так, как я хочу (без этого «конфига» перед URL)

1 Ответ

0 голосов
/ 21 марта 2019

Ваша конфигурация содержит следующее:

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. Вы можете редактировать его в своем блоке местоположения следующим образом:

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}

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

...