質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • PHP

    19786questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • nginx

    815questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • CodeIgniter

    270questions

    CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

NginxですべてのリクエストをPHPにRewriteしたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,022

it-bamboo

score 3

こんにちは。
Nginxの設定についてお聞きしたいです。

前提・実現したいこと

現在PHPフレームワーク( Codeigniter )を用いてウェブアプリケーションの開発を行っております。
そのなかでWebサーバーのドキュメントルートにない画像ファイルを取得して、ユーザーにアクセス権があるかどうかを確認した上でPHPでReadfile関数を用いてブラウザに出力するという処理を実装しました。
このとき、CodeIgniterのルーティング機能を用いて、たとえばurl.com/viewimage/abcdef.jpgというURLでアクセスされた時にはViewimage関数(自作)の第一引数としてabcdef.jpgを渡してPHP側でファイルを探すという方法を取っています。

開発環境のApache2.4 + PHP-FPM(7.0)を使用したサーバーでは、.htaccessに

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
  RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>


と記述して、一部のファイルを除くすべてのリクエストをindex.phpに投げるように設定しており、この環境では何の問題もなく動作しています。

発生している問題・エラーメッセージ

本番環境のNginxサーバーにアップロードし動作テストを行ったところ、画像表示部分以外はすべて問題なく動作するのですが、当該部分のリクエストを行った時、

404 Not Found
nginx


というNginxの404ページが表示されてしまいます。

下記の通り、実際に存在しないファイルへのリクエストはすべてindex.phpに投げるように設定しているつもりなのですが...

Nginxのconfファイル

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  root /var/www/public;
  index index.html index.htm index.php;

  location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
    log_not_found off;
  }

  server_name abcdef.com;

  # Security
  add_header X-Frame-Options SAMEORIGIN;
  add_header X-Content-Type-Options nosniff;
  add_header X-XSS-Protection "1; mode=block";

  location / {
    # たぶんここら辺に問題があるのかなと思います...
    try_files $uri $uri/ /index.php?/$request_uri;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  }

  location ~ /\.ht {
    deny all;
  }
}

試したこと

url.com/viewimage/abcdef.jpg
にアクセスした場合Nginxの404画面が表示されるのですが、末尾をたとえばabcdef.jpggなどとして、変な拡張子にしてリクエストするときちんと処理されるらしくCodeIgniterの404画面が表示されます。
おそらく、pngやjpgなどといったきちんとした拡張子が末尾に来るリクエストのみ、PHP側に渡されることなくNginx側が処理してしまっているものと思っています。

おそらく設定次第でなんとかなるものと思いたいのです。。。
(ここがうまくいかないと本番環境のサーバーをApacheで構築し直さねばなりません...)

どなたか、お力をお貸しください。
他の箇所の設定ファイルが必要であれば、教えてください。
よろしくお願い申し上げます。

ソフトウェアのバージョン等

Nginx/1.10.0
OS: Ubuntu
PHP 7.0.8

追記: Nginxのデバッグログ

リクエストを受けてからレスポンスヘッダを返すまでの一部のみ記載しています。

2017/01/06 13:42:54 [debug] 20967#20967: *67 http request line: "GET /viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png HTTP/1.1"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http uri: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http args: ""
2017/01/06 13:42:54 [debug] 20967#20967: *67 http exten: "png" // ここでNginx側に判定されるのは怪しいです...
2017/01/06 13:42:54 [debug] 20967#20967: *67 posix_memalign: 0000557FB465B9B0:4096 @16 
2017/01/06 13:42:54 [debug] 20967#20967: *67 http process request header line
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Host: url.com"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Connection: keep-alive"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Cache-Control: max-age=0"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Upgrade-Insecure-Requests: 1"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "DNT: 1"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Accept-Encoding: gzip, deflate, sdch"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Accept-Language: ja,en-US;q=0.8,en;q=0.6"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http header done
2017/01/06 13:42:54 [debug] 20967#20967: *67 event timer del: 9: 1483677834748
2017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 0
2017/01/06 13:42:54 [debug] 20967#20967: *67 rewrite phase: 1
2017/01/06 13:42:54 [debug] 20967#20967: *67 test location: "/"
2017/01/06 13:42:54 [debug] 20967#20967: *67 test location: ~ "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$"
2017/01/06 13:42:54 [debug] 20967#20967: *67 using configuration "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$"
2017/01/06 13:42:54 [debug] 20967#20967: *67 http cl:-1 max:1048576
2017/01/06 13:42:54 [debug] 20967#20967: *67 rewrite phase: 3
2017/01/06 13:42:54 [debug] 20967#20967: *67 post rewrite phase: 4
2017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 5
2017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 6
2017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 7
2017/01/06 13:42:54 [debug] 20967#20967: *67 access phase: 8
2017/01/06 13:42:54 [debug] 20967#20967: *67 access phase: 9
2017/01/06 13:42:54 [debug] 20967#20967: *67 access phase: 10
2017/01/06 13:42:54 [debug] 20967#20967: *67 post access phase: 11
2017/01/06 13:42:54 [debug] 20967#20967: *67 try files phase: 12
2017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 13
2017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 14
2017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 15
2017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 16
2017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 17
2017/01/06 13:42:54 [debug] 20967#20967: *67 http filename: "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png"
2017/01/06 13:42:54 [debug] 20967#20967: *67 add cleanup: 0000557FB465B758
2017/01/06 13:42:54 [error] 20967#20967: *67 open() "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png" failed (2: No such file or directory), client: xxx.xx.xx.xx, server: url.com, request: "GET /viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png HTTP/1.1", host: "url.com"

追記2: 正常にリライトされた時のデバッグログ

文字数制限のため一部省略しています。

2017/01/06 14:03:50 [debug] 21040#21040: *132 http request line: "GET /viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg HTTP/1.1"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http uri: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http args: ""
2017/01/06 14:03:50 [debug] 21040#21040: *132 http exten: "pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 posix_memalign: 0000557FB465F9C0:4096 @16
2017/01/06 14:03:50 [debug] 21040#21040: *132 http process request header line
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Host: bbs.sugakubu.com"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Connection: keep-alive"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Cache-Control: max-age=0"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Upgrade-Insecure-Requests: 1"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "DNT: 1"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Accept-Encoding: gzip, deflate, sdch"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Accept-Language: ja,en-US;q=0.8,en;q=0.6"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http header done
2017/01/06 14:03:50 [debug] 21040#21040: *132 event timer del: 3: 1483679090605
2017/01/06 14:03:50 [debug] 21040#21040: *132 generic phase: 0
2017/01/06 14:03:50 [debug] 21040#21040: *132 rewrite phase: 1
2017/01/06 14:03:50 [debug] 21040#21040: *132 test location: "/"
2017/01/06 14:03:50 [debug] 21040#21040: *132 test location: ~ "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$"
2017/01/06 14:03:50 [debug] 21040#21040: *132 test location: ~ "[^/]\.php(/|$)"
2017/01/06 14:03:50 [debug] 21040#21040: *132 test location: ~ "/\.ht"
2017/01/06 14:03:50 [debug] 21040#21040: *132 using configuration "/"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http cl:-1 max:1048576
2017/01/06 14:03:50 [debug] 21040#21040: *132 rewrite phase: 3
2017/01/06 14:03:50 [debug] 21040#21040: *132 post rewrite phase: 4
2017/01/06 14:03:50 [debug] 21040#21040: *132 generic phase: 5-7
2017/01/06 14:03:50 [debug] 21040#21040: *132 access phase: 8-10
2017/01/06 14:03:50 [debug] 21040#21040: *132 post access phase: 11
2017/01/06 14:03:50 [debug] 21040#21040: *132 try files phase: 12
2017/01/06 14:03:50 [debug] 21040#21040: *132 http script var: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 trying to use file: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http script var: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 trying to use dir: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http script copy: "/index.php?/"
2017/01/06 14:03:50 [debug] 21040#21040: *132 http script var: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 trying to use file: "/index.php?//viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" "/var/www/public/index.php?//viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
2017/01/06 14:03:50 [debug] 21040#21040: *132 internal redirect: "/index.php?//viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

デバッグしてみれば?
nginxの動作状況を確認したい
久しぶりに見たらなぜかマイナス評価になってましたが、error_log で挙動を追うと良いです。
debug レベルだとちょっと情報が多すぎたので私は notice で確認しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 14:01

    ご回答ありがとうございます。
    error_logにdebugを記述してログを出力してみました。noticeは発生しませんでした...
    しかしどうもPHPにリライトしようとする動作が全くみられないように思うのです...
    ログは質問内容に追記しています。

    キャンセル

  • 2017/01/06 14:11

    '/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png'
    これ、意図したものになってないですよね?

    '~ "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$"'
    これが効いています。

    って切り分けていくと分かるかと。

    キャンセル

  • 2017/01/06 14:21

    説明不足で申し訳在りません。その箇所はsites-available内のconfファイルに記述した
    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
    log_not_found off;
    }
    が効いているものです。
    試しにその箇所をすべてコメントアウトしてみたところ、無事意図した通りに動作しました!!
    本当にありがとうございました!!

    キャンセル

0

少し当てずっぽうな回答になりますが、雰囲気はこんな感じかな?

  location / {
    try_files $uri $uri/ /index.php/$request_uri;
  }

  location ~ [^/]\.php(/|$) {
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }

fastcgi_split_path_info を忘れると脆弱性の元になるらしいので注意してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 13:52

    ご回答ありがとうございます。
    location ~ [^/]\.php(/|$)ブロック内の設定なのですが、デフォルトの記述でsnippets/fastcgi-php.confをincludeしており、そのファイル内で同じ記述がなされているようでした。
    念のためご指摘いただいたように記述して再起動しましたが、やはり動作に変わりはありませんでした...

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19786questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • nginx

    815questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • CodeIgniter

    270questions

    CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。