人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CentOS release 6.6 (Final)+ Nginx+PHP-FPM+MySQL環境でフレームワークにCurry1.14を利用してシステム構築をしています。

【やりたいこと】は、Nginxのrewite機能を利用して、
http://xxxxxxx.com/pro/items/1/2/2016-06-16/11/0
へのアクセスで
http://xxxxxxx.com/pro/index.php?A=1&B=2&C=2016-06-16&D=11&E=0
にrewiteし、ブラウザのアドレスバーには
http://xxxxxxx.com/pro/items/1/2/2016-06-16/11/0
と表示されている状態になることです。

/etc/nginx/sites-available/pro に以下を設定し
rewriteはできたのですが、アドレスバーは
http://xxxxxxx.com/pro/index.php?A=1&B=2&C=2016-06-16&D=11&E=0
となります。

---------------------------
location /pro/ {
root /var/www/html;
index index.php;
rewrite ^/pro/items/([0-9]+)/([0-9]+)/([^/]+)/([0-9]+)/([0-9]+) /pro/index.php?A=$1&B=$2&C=$3&D=$4&E=$5 permanent;
try_files $uri $uri/ /pro/index.php?$args;
}
---------------------------

そこで、rewriteの最後をpermanentからbreakに変更したところ、アドレスバーは
http://xxxxxxx.com/pro/items/1/2/2016-06-16/11/0
となりますが
PHP が動作せずCromeではテキストファイルがダウンロードされ、IEでは画面にプログラムが表示されてます。

【やりたいこと】ができる設定方法を詳細に教えていただけませんでしょうか?

●質問者: turinavi
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tezcello
●500ポイント ベストアンサー

「やりたいこと」の本質は、Curry でルーティングするためにフロントのスクリプトに処理を渡したいという事だと思いますので、それに沿って回答します。

> /etc/nginx/sites-available/pro に以下を設定し
デフォルトではそこを読むようにはなっていませんよね?
/etc/nginx/nginx.conf の設定を変更されていると思いますが、どのように変更しているかでいろいろ変わってきてしまうのはお解りですよね?

とりあえず出来るだけデフォルトから変更しない方向で書いていきます。


CentOS 6.6 でサーバを minimam で構築します。

(Nginx をインストールするために)リポジトリ EPEL を追加します。

EPEL より Nginx をインストールします。

PHP, PHP-FPM をインストールします。

/etc/nginx/default.conf の名前を変更しておきます。
default.conf -> default.conf.bak

/etc/nginx/prot.conf を作成して以下を記述します。

server {
 index index.php;
 server_name example.com;
 root /usr/share/nginx/html;

 location /pro {
 if (!-e $request_filename) {
 rewrite ^/pro/(.*) /pro/curry.php last;
 }
 }

 location ~ .php$ {
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 include fastcgi_params;
 }
}

Curry を完全にインストールするのは手間が掛かりそうなので、REQUEST_URI が取得できるかだけチェックします。

/usr/share/nginx/html/pro/index.php に以下を記述します。

<?php
var_dump($_SERVER['REQUEST_URI']);

/etc/php-fpm.d/www.conf の動作するユーザ、グループを nginx に変更します。

PHP-FPM, Nginx を起動します。

ブラウザで http://example.com/pro/hoge0?a=1 にアクセスすれば以下の様に表示されると思います。

string(14) "/pro/hoge0?a=1" 


ドキュメントルートをデフォルト以外に設置する場合は、SELinux のポリシーを適切に設定する必要があるのをお忘れなく。
__SELinux を止めてしまう解説ページが非常に多いのはいかがなモノか


turinaviさんのコメント
ご回答ありがとうございます。 申し訳ないのですが、こちらの環境はすでに稼働している環境でして、いちから構築できるものではありません。ですので、現在の環境で何とか動かす方法をお伺いしたいと思います。 はてなの500文字制限の関係で、全ての情報を書けず申し訳ありませんでした。 /etc/nginx/sites-available/pro は正確ではなかったです。 /etc/nginx/sites-enabled/pro が正確でした。 (シンボリックリンクをはっていますので) /etc/nginx/prot.conf でそのディレクトリは include しています。 また、ご回答頂いた部分までは既に動作確認はできております。やりたいことは、 rewrite ^/pro/items/([0-9]+)/([0-9]+)/([^/]+)/([0-9]+)/([0-9]+) /pro/index.php?A=$1&B=$2&C=$3&D=$4&E=$5 break; としても、正常にPHPが動作するような設定方法です。 permanent であれば、正常に動作はしています。 よろしくお願いします。

tezcelloさんのコメント
> いちから構築できるものではありません ご破算にして最初からやるのを進めているのではなくて、何がどうなっているのか判らないので、「変更範囲を必要最小限でやると」のつもりで書きました。 既に変更している部分を上書きするなり、追加するなりすればよいでしょうから。 > ご回答頂いた部分までは既に動作確認はできております pro/以下は Curry を稼働させているのだと読んだのですが違いますか? Curry が動いているのであれば、 http://xxxxxxx.com/pro/items/1/2/2016-06-16/11/0 を http://xxxxxxx.com/pro/index.php?A=1&B=2&C=2016-06-16&D=11&E=0 でのアクセスと同じパラメータ設定とするのは、Curry の Router クラスがやる事だと思います。 マニュアルによると config.ini に [routeingpro] request = items/*/*/*/*/* route = controller/A/B/C/D/E のように記述すれば、item コントローラのデフォルトアクション(=index)が起動され、 $this->params['A'] のようにすればパラメータを取得できると思います。 __繰り返しますが、Curry のフロントスクリプトに __全てのアクセスを渡す事が出来ているという前提です Curry ではなく別な何かを動かすのであれば、 > rewrite ^/pro/items/([0-9]+)/([0-9]+)/([^/]+)/([0-9]+)/([0-9]+) /pro/index.php?A=$1&B=$2&C=$3&D=$4&E=$5 break; break ではなく last では?

turinaviさんのコメント
ご回答ありがとうございます。CurryはApachの.htaccess を前提に動作しているようで、Nginxにはそれがありません。ですので、routing.iniのルーティング機能が使えないらしく、rewriteで動作させようとしています。routing.iniで動作できればそれが一番いいのですが。パラメータがわたっていることは確認できています。

turinaviさんのコメント
ご回答ありがとうございます。break を last に変更すると HTTP 404 となります。

tezcelloさんのコメント
> CurryはApachの.htaccess を前提に動作しているようで、Nginxにはそれがありません。ですので、routing.iniのルーティング機能が使えない .htaccess が使えない=routing.ini が機能しない とお考えのようですが、それは違うと思います。 Router クラスで $_SERVER['REQUEST_URI'] を取得して、routing.ini と突き合わせてパラメータをセットしているハズです。 つまり、http://xxxxxxx.com/pro/items/1/2/2016-06-16/11/0 のようなアクセスを、Curry のフロント(今回はたぶん ドキュメントルート/pro/index.php )に渡せればOKです。 > パラメータがわたっていることは確認できています。 パラメータが渡っているという事は正常に動作している事だと思うのですが、何が問題なのでしょう? items コントローラのデフォルトアクション(設定していなければ index )が処理され、パラメータも取得できているという事ですよね? 面倒ですが、できるだけ省略しないで状況等を書いて頂けませんか? http://xxxxxxx.com/pro/index.php?A=1&B=2&C=2016-06-16&D=11&E=0 でアクセスした場合はデフォルトアクションが走り、パラメータを認識できるという事でしょうか? > break を last に変更すると HTTP 404 となります 回答が手抜きでしたね。 どこでどのように読み込まれているのか不明ですので、当方で試したものがどんな構成になるのかを再度記します。 (実際には /etc/nginx/nginx.conf の http セクションの include /etc/nginx/conf.d/*.conf; によって pro.conf が読み込まれています) http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { index index.php; server_name example.com; root /usr/share/nginx/html; location /pro { if (!-e $request_filename) { rewrite ^/pro/items/([0-9]+)/([0-9]+)/([^/]+)/([0-9]+)/([0-9]+) /pro/index.php?A=$1&B=$2&C=$3&D=$4&E=$5 last; # rewrite ^/pro/(.*) /pro/index.php last; } } location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; } } } 上記の様に設定する事で、pro/index.php を起動する事が出来ています。 server_name や root などを環境に合わせた上で、ファイルを分割するなら適宜配置して innclude するように書き直してください。 http://xxxxxxx.com/pro/items/1/2/2016-06-16/11/0 を http://xxxxxxx.com/pro/index.php?A=1&B=2&C=2016-06-16&D=11&E=0 に書き換える方を生かしてありますが、本来こちら側の書き換えは不要です。 if 以下は if (!-e $request_filename) { rewrite ^/pro/(.*) /pro/index.php last; } で Curry に渡す事が出来るだろうと思います。 __try_files が怪しい気がしますが、調べてはいません。 __if () で存在しないリクエストを処理しているので __try_files は不要です 質問者さんの全体構成は不明ですが、location で root を指定したりするのは、考え方が違うのではないかという印象です。 ドキュメントルートはサーバ毎にあるべきで、特定URLに対して本来のドキュメントルートと違うモノを指定したいような場合は、alias が適当じゃないかと思います。 しかも、他のアクセス時のドキュメントルート以下に別のURLのドキュメントルートがあるのは構造的にもねじれている印象です。 サーバ系で予定通りの動作でない時は、ログを見るところから始まります。 この 404 が出る時に、Nginx のエラーログに何か出ているハズです。 その記述が重要なヒントになります。 今回の場合、書換えを行った後の見つからないファイルが何であるかが示されていると思います。

turinaviさんのコメント
詳細にありがとうございます。これから試してみます。 別件もあります関係で少しお時間をください。

turinaviさんのコメント
再度設定を行ったところ、うまく動きました。大変ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ