Назад | Перейти на главную страницу

URL-адрес маршрутизации php на index.php nginx

Я использую сервер nginx / php5.6-fpm, и у меня есть следующие

server {
        listen 10080;
        listen [::]:10080;

        root /home/vagrant/app;
        index index.php;

        server_name mia-dev.dev;
        port_in_redirect on;
        rewrite ^/static/(.*)$ /dist/static/$1 permanent;

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

        # load the index page on 404
        error_page 404 /index.php;

        # don't log requests to favicon.ico
        location = /favicon.ico {
            log_not_found off;
            access_log    off;
        }

        # don't log requests to robots.txt
        location = /robots.txt {
            log_not_found off;
            access_log    off;
        }

        # pass the PHP scripts to FastCGI server listening on the php-fpm socket
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       fastcgi_intercept_errors on;
#       fastcgi_intercept_errors on;
                try_files $uri /index.php =404;
                fastcgi_pass 0.0.0.0:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #       fastcgi_param SCRIPT_FILENAME $document_root/index.php;
                fastcgi_param HTTPS off;
        }

        # disable access to .htaccess files
        location ~ /\.ht {
            deny all;
        }


        sendfile off;
}

и в файле php у меня есть

$app = new Lime\App();

$app->bind("/create/name/", function(){
  return "hi mia";
});

$app->bind("/", function() {
    return "hellow world";
});



$app->run();

Хотя я получаю «привет, мир» при переходе в «/», я не получаю «привет, миа», когда перехожу в «/ create / name»

Судя по тому, что я исследовал в Интернете, я, похоже, все сделал правильно, поэтому я не уверен, в чем проблема ...

Обновление 2:

Решение:

может применяться к любому приложению PHP, которое требует маршрутизации, при желании пропустите комментарий :-P

    ...

    location / {
      try_files $uri $uri/ @lime;
    }

    # pass the PHP scripts to FastCGI server listening on the php-fpm socket
    location @lime {
            # no `.php` in our fancy uri, useless
    #       fastcgi_split_path_info ^(.+\.php)(/.+)$;

    #       fastcgi_intercept_errors on;

            # useless as well
    #       try_files $uri /index.php =404;

            fastcgi_pass 0.0.0.0:9000;
            fastcgi_index index.php;
            include fastcgi_params;
    #       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            # Yeah, you should use index.php and it will route for you
            fastcgi_param SCRIPT_FILENAME $document_root/index.php;

            fastcgi_param HTTPS off;
    }

    ...

С помощью @ войти в систему try_files выполнить внутреннее перенаправление - это самый чистый способ, рекомендованный документация nginx. Создание отдельного блока местоположения для каждого маршрута вызовет огромное количество повторяющихся конфигураций по мере роста вашего приложения. Между тем, манипулирование кодом для получения информации о пути в параметре сценария (неприятный способ, используемый Dupral) нарушает элегантность механизма маршрутизации в вашей структуре, поэтому не рекомендуется.


Обновить:

Это что-то связано с вашей конфигурацией nginx.

когда клиент посещает /create/name/, в вашей конфигурации nginx он ударит

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

с участием $uri="/create/name/" и $query_string="" , поэтому переписать в /index.php? а затем сопоставлен

    location ~ \.php$ {
    ...

То есть, с точки зрения nginx, посещение /create/name/ эквивалентно посещению /index.php. В результате скрипт php не получит указанный путь. Поэтому мы всегда получаем индексную страницу.


Вы добавили <?php в самом начале вашего php файла?

Кроме того, согласно документации вашего фреймворка, у вас также должен быть этот

require_once("src/Lime/App.php");

в твоем index.php.


Ссылка:

  1. http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

В своей конфигурации Nginx вы не упомянули, что Nginx должен делать при сопоставлении с вашим шаблоном.

Блок местоположения по умолчанию будет соответствовать вашему запросу в следующем порядке:

  1. Он пытается найти /create/name/index.php, поскольку вы упоминаете, что индексный файл - index.php, но, по-видимому, его не существует.

  2. Он пытается найти /, как вы упомянули в try_files для $ uri и $ uri /, но это не совпадает.

  3. Когда он пытается /index.php?query_string , поскольку вы просматриваете папку, для Nginx нет параметра query_string.

Думаю, у вас может быть два решения:

Добавить новый блок местоположения

location /create/name/ {
     try_files $uri $uri/ /index.php?$query_string;
}

Добавление правила перезаписи

rewrite ^/create/name/$ /index.php?q=create permanent;

внутри вашего PHP-приложения:

$app->get("/:q", function($params){
    if ($params["q"] == 'create'){
        return "hi mia";
    }
});

Ссылка: известь-php