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」が表示されません
私がオンラインで調査したものに基づいて、私はすべてを正しく行ったように見えたので、何が問題なのかわかりません...
更新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
で。
参照:
Nginxの設定では、パターンを照合するときにNginxが何をすべきかについては触れていません。
デフォルトのロケーションブロックは、次の順序でリクエストと一致します。
インデックスファイルがindex.phpであるとおっしゃるように、/ create/name/index.phpを見つけようとしますが、存在しません。
$ uriと$ uri /のtry_filesで述べたように/を見つけようとしますが、一致しません。
/ 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