php URL de roteamento para index.php nginx

1

Estou executando um servidor nginx / php5.6-fpm e tenho o seguinte

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;
}

e em um arquivo php eu tenho

$app = new Lime\App();

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

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



$app->run();

Enquanto eu recebo o "hello world" quando vou para "/" eu não obtenho o "hi mia" quando vou para "/ create / name"

Com base no que pesquisei on-line, parece que fiz tudo certo, por isso não sei qual é o problema ...

    
por Kendall 16.08.2016 / 17:21

2 respostas

2

Atualização 2:

Solução:

pode se aplicar a qualquer aplicativo PHP que precise de roteamento, pule o comentário se desejar :-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;
    }

    ...

Usar o @ login em try_files para realizar o redirecionamento interno é a maneira mais clara recomendada pela documentação do nginx . A criação de um bloco de localização separado para cada rota causará grandes quantidades de configurações duplicadas à medida que seu aplicativo cresce. Enquanto isso, manipular o código para obter as informações de caminho no parâmetro de script (uma maneira desagradável usada por Dupral) quebra a elegância do mecanismo de roteamento por sua estrutura, portanto, não é recomendado.

Atualização:

É algo relacionado à sua configuração do nginx.

quando o cliente visitar /create/name/ , em sua configuração do nginx, ele acessará

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

com $uri="/create/name/" e $query_string="" , portanto, seja reescrito em /index.php? e, em seguida, correspondido por

    location ~ \.php$ {
    ...

Ou seja, na perspectiva do nginx, visitar /create/name/ é equivalente a visitar /index.php . Como resultado, o script php não obterá o caminho especificado. Portanto, sempre obtemos a página de índice.

Você adicionou <?php no início do seu arquivo php?

Além disso, de acordo com a documentação do seu framework, você também deve ter isto

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

no seu index.php .

Referência:

  1. link
por 16.08.2016 / 17:47
1

Na sua configuração Nginx, você não mencionou o que o Nginx deve fazer quando corresponder ao seu padrão.

O bloco de localização predefinido corresponderá ao seu pedido pela seguinte ordem:

  1. Ele tenta encontrar o /create/name/index.php, já que você mencionou que o arquivo de índice é index.php, mas aparentemente ele não existe.

  2. Ele tenta encontrar o / como você mencionou em try_files para $ uri e $ uri / mas ele não corresponde.

  3. Quando ele tenta a configuração /index.php?query_string , já que você está navegando na pasta, não há um parâmetro query_string para o Nginx corresponder.

Eu acho que você pode ter duas soluções:

Adicione um novo bloco de localização

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

Adicionando regra de reescrita

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

dentro da sua aplicação PHP:

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

Referência: cal-php

    
por 16.08.2016 / 18:35