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

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

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

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

PHP

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

CodeIgniter

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

Q&A

解決済

2回答

4087閲覧

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

it-bamboo

総合スコア10

nginx

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

PHP

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

CodeIgniter

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

0グッド

0クリップ

投稿2017/01/05 13:54

編集2017/01/06 05:14

こんにちは。
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ファイル

conf

1server { 2 listen 80 default_server; 3 listen [::]:80 default_server; 4 5 root /var/www/public; 6 index index.html index.htm index.php; 7 8 location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ { 9 log_not_found off; 10 } 11 12 server_name abcdef.com; 13 14 # Security 15 add_header X-Frame-Options SAMEORIGIN; 16 add_header X-Content-Type-Options nosniff; 17 add_header X-XSS-Protection "1; mode=block"; 18 19 location / { 20 # たぶんここら辺に問題があるのかなと思います... 21 try_files $uri $uri/ /index.php?/$request_uri; 22 } 23 24 location ~ \.php$ { 25 include snippets/fastcgi-php.conf; 26 fastcgi_pass unix:/run/php/php7.0-fpm.sock; 27 } 28 29 location ~ /\.ht { 30 deny all; 31 } 32}

###試したこと
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のデバッグログ
リクエストを受けてからレスポンスヘッダを返すまでの一部のみ記載しています。

log

12017/01/06 13:42:54 [debug] 20967#20967: *67 http request line: "GET /viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png HTTP/1.1" 22017/01/06 13:42:54 [debug] 20967#20967: *67 http uri: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png" 32017/01/06 13:42:54 [debug] 20967#20967: *67 http args: "" 42017/01/06 13:42:54 [debug] 20967#20967: *67 http exten: "png" // ここでNginx側に判定されるのは怪しいです... 52017/01/06 13:42:54 [debug] 20967#20967: *67 posix_memalign: 0000557FB465B9B0:4096 @16 62017/01/06 13:42:54 [debug] 20967#20967: *67 http process request header line 72017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Host: url.com" 82017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Connection: keep-alive" 92017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Cache-Control: max-age=0" 102017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Upgrade-Insecure-Requests: 1" 112017/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" 122017/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" 132017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "DNT: 1" 142017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Accept-Encoding: gzip, deflate, sdch" 152017/01/06 13:42:54 [debug] 20967#20967: *67 http header: "Accept-Language: ja,en-US;q=0.8,en;q=0.6" 162017/01/06 13:42:54 [debug] 20967#20967: *67 http header done 172017/01/06 13:42:54 [debug] 20967#20967: *67 event timer del: 9: 1483677834748 182017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 0 192017/01/06 13:42:54 [debug] 20967#20967: *67 rewrite phase: 1 202017/01/06 13:42:54 [debug] 20967#20967: *67 test location: "/" 212017/01/06 13:42:54 [debug] 20967#20967: *67 test location: ~ "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$" 222017/01/06 13:42:54 [debug] 20967#20967: *67 using configuration "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$" 232017/01/06 13:42:54 [debug] 20967#20967: *67 http cl:-1 max:1048576 242017/01/06 13:42:54 [debug] 20967#20967: *67 rewrite phase: 3 252017/01/06 13:42:54 [debug] 20967#20967: *67 post rewrite phase: 4 262017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 5 272017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 6 282017/01/06 13:42:54 [debug] 20967#20967: *67 generic phase: 7 292017/01/06 13:42:54 [debug] 20967#20967: *67 access phase: 8 302017/01/06 13:42:54 [debug] 20967#20967: *67 access phase: 9 312017/01/06 13:42:54 [debug] 20967#20967: *67 access phase: 10 322017/01/06 13:42:54 [debug] 20967#20967: *67 post access phase: 11 332017/01/06 13:42:54 [debug] 20967#20967: *67 try files phase: 12 342017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 13 352017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 14 362017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 15 372017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 16 382017/01/06 13:42:54 [debug] 20967#20967: *67 content phase: 17 392017/01/06 13:42:54 [debug] 20967#20967: *67 http filename: "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png" 402017/01/06 13:42:54 [debug] 20967#20967: *67 add cleanup: 0000557FB465B758 412017/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: 正常にリライトされた時のデバッグログ
文字数制限のため一部省略しています。

log

12017/01/06 14:03:50 [debug] 21040#21040: *132 http request line: "GET /viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg HTTP/1.1" 22017/01/06 14:03:50 [debug] 21040#21040: *132 http uri: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" 32017/01/06 14:03:50 [debug] 21040#21040: *132 http args: "" 42017/01/06 14:03:50 [debug] 21040#21040: *132 http exten: "pngg" 52017/01/06 14:03:50 [debug] 21040#21040: *132 posix_memalign: 0000557FB465F9C0:4096 @16 62017/01/06 14:03:50 [debug] 21040#21040: *132 http process request header line 72017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Host: bbs.sugakubu.com" 82017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Connection: keep-alive" 92017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Cache-Control: max-age=0" 102017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Upgrade-Insecure-Requests: 1" 112017/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" 122017/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" 132017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "DNT: 1" 142017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Accept-Encoding: gzip, deflate, sdch" 152017/01/06 14:03:50 [debug] 21040#21040: *132 http header: "Accept-Language: ja,en-US;q=0.8,en;q=0.6" 162017/01/06 14:03:50 [debug] 21040#21040: *132 http header done 172017/01/06 14:03:50 [debug] 21040#21040: *132 event timer del: 3: 1483679090605 182017/01/06 14:03:50 [debug] 21040#21040: *132 generic phase: 0 192017/01/06 14:03:50 [debug] 21040#21040: *132 rewrite phase: 1 202017/01/06 14:03:50 [debug] 21040#21040: *132 test location: "/" 212017/01/06 14:03:50 [debug] 21040#21040: *132 test location: ~ "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$" 222017/01/06 14:03:50 [debug] 21040#21040: *132 test location: ~ "[^/]\.php(/|$)" 232017/01/06 14:03:50 [debug] 21040#21040: *132 test location: ~ "/\.ht" 242017/01/06 14:03:50 [debug] 21040#21040: *132 using configuration "/" 252017/01/06 14:03:50 [debug] 21040#21040: *132 http cl:-1 max:1048576 262017/01/06 14:03:50 [debug] 21040#21040: *132 rewrite phase: 3 272017/01/06 14:03:50 [debug] 21040#21040: *132 post rewrite phase: 4 282017/01/06 14:03:50 [debug] 21040#21040: *132 generic phase: 5-7 292017/01/06 14:03:50 [debug] 21040#21040: *132 access phase: 8-10 302017/01/06 14:03:50 [debug] 21040#21040: *132 post access phase: 11 312017/01/06 14:03:50 [debug] 21040#21040: *132 try files phase: 12 322017/01/06 14:03:50 [debug] 21040#21040: *132 http script var: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" 332017/01/06 14:03:50 [debug] 21040#21040: *132 trying to use file: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" 342017/01/06 14:03:50 [debug] 21040#21040: *132 http script var: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" 352017/01/06 14:03:50 [debug] 21040#21040: *132 trying to use dir: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" "/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" 362017/01/06 14:03:50 [debug] 21040#21040: *132 http script copy: "/index.php?/" 372017/01/06 14:03:50 [debug] 21040#21040: *132 http script var: "/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg" 382017/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" 392017/01/06 14:03:50 [debug] 21040#21040: *132 internal redirect: "/index.php?//viewimage/c91b92640d7e2c6d36eca6c0b57122e4.pngg"

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

投稿2017/01/05 22:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

it-bamboo

2017/01/06 05:01

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

退会済みユーザー

2017/01/06 05:11

'/var/www/public/viewimage/c91b92640d7e2c6d36eca6c0b57122e4.png' これ、意図したものになってないですよね? '~ "\.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$"' これが効いています。 って切り分けていくと分かるかと。
it-bamboo

2017/01/06 05:21

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

0

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

nginx

1 location / { 2 try_files $uri $uri/ /index.php/$request_uri; 3 } 4 5 location ~ [^/]\.php(/|$) { 6 fastcgi_pass unix:/run/php/php7.0-fpm.sock; 7 fastcgi_split_path_info ^(.+?\.php)(/.*)$; 8 include fastcgi_params; 9 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 10 fastcgi_param PATH_INFO $fastcgi_path_info; 11 }

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

投稿2017/01/05 20:42

night1ynx

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

it-bamboo

2017/01/06 04:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問