web-dev-qa-db-ja.com

phpルーティングURLから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();

「/」に移動すると「hello world」が表示されますが、「/ create/name」に移動すると「hi mia」が表示されません

私がオンラインで調査したものに基づいて、私はすべてを正しく行ったように見えたので、何が問題なのかわかりません...

3
Kendall ARNEAUD

更新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
4
ttimasdf

Nginxの設定では、パターンを照合するときにNginxが何をすべきかについては触れていません。

デフォルトのロケーションブロックは、次の順序でリクエストと一致します。

  1. インデックスファイルがindex.phpであるとおっしゃるように、/ create/name/index.phpを見つけようとしますが、存在しません。

  2. $ uriと$ uri /のtry_filesで述べたように/を見つけようとしますが、一致しません。

  3. / index.php?query_string設定を試行すると、フォルダーを参照しているため、一致するNginxのquery_stringパラメーターはありません。

私はあなたが2つの解決策を持つことができると思います:

新しいロケーションブロックを追加します

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

リファレンス: Lime-php

1
Simon MC. Cheng