web-dev-qa-db-ja.com

イメージがファイルサーバーに存在しない場合、NginXはPHPファイルにリダイレクトします

これが私がやろうとしていることです。私は、Apacheでできるようなカスタム書き換えルールを作成するのに十分なNginxに精通していません。誰かがNginxの設定ファイルを手伝ってくれれば幸いです!前もって感謝します!

ポート80でNginxを実行し、8080でApacheをリッスンするイメージサーバーがあります。やりたいことは...

次のように存在しない画像をリクエストすると:

http://img.server.com/(...ANY DIRECTORY...)/123_4_anyimagename.jpg

にリダイレクトされます

http://img.server.com:8080/image.php?id=123_4_anyimagename

ありがとうございました!私はこれがほとんど機能しています!ルートに入れなければなりませんでした

location ~ \.(gif|jpg|png)${
    root /var/www/mysite.com/httpdocs/;
    try_files $uri @img_proxy
}

location @img_proxy {
    rewrite ^(.*)$ /image.php?id=$1
    proxy_pass      http://127.0.0.1:8080;
}

であるimages.phpファイルで

/var/www/mysite.com/httpdocs/image.php

私は単に持っています

<?php echo "test"; ?>  

その動作を確認します。問題は、PHPが起動せず、プレーンテキストとしてレンダリングするだけのようです。そのほとんど!どこを見るべきかについての手がかりはありますか?

http://mydomain.com:8080/image.phpを実行すると、出力として「テスト」が表示されます。だから私はPHPが動作していることを知っています。私は何を見落としていますか?

2
angel

Nginxは、ifステートメントとリライトを使用する代わりに、try_filesディレクティブを使用して「何かが存在するかどうかを確認し、別のオプションにフォールバックします」。

サーバーブロック内で、ファイルに一致する場所ブロックを作成します(たとえば、jpg、gif、pngで終わるファイル-必要な拡張子を追加します)。そのブロック内に、try_filesディレクティブを追加します。 Nginxはパスを順番に試します。したがって、画像への直接パスから始めて、phpファイルへのパスをリストします(ただし、プロキシする必要があるため、代わりに名前付きの場所を使用します)。おそらく次のようなもの:

location ~ \.(gif|jpg|png) {
    try_files $uri @img_proxy;
}

上記は基本的に次のようになります。gif、.jpg、または.pngで終わるファイルの場合、最初にパス($uri)を試し、存在しない場合は@img_proxyに進みます。

次に、実際のファイルが見つからない場合にnginxが使用する2番目の場所@img_proxyを作成する必要があります。これで、プロキシ設定を指定し、パスを変更するための書き換えも行い、最後にURIをバックエンドサーバーに渡します。

次のようなもの(正規表現は探しているものではありません-ファイル名だけでなくパス全体を渡します-ニーズに合わせて変更できます):

location @img_proxy {
    rewrite ^(.*)$ /image.php?id=$1;
    proxy_pass      http://127.0.0.1:8080;
}

[不足しているセミコロンを修正するために編集]

7
cyberx86

これは古い投稿です。他の答えは私には役に立たなかったので、同じ問題を抱えている他のプログラマと簡単な解決策を共有しています。書き換えルールの最後にredirectまたはpermanentのコードがありません:

location ~ \.(gif|jpg|png)${
    root /var/www/mysite.com/httpdocs/;
    try_files $uri @img_proxy;
}

location @img_proxy {
    rewrite ^(.*)$ /image.php?id=$1 redirect;
    proxy_pass      http://127.0.0.1:8080;
}

または1行で:

location @img_proxy {
    rewrite ^(.*)$ http://127.0.0.1:8080/image.php?id=$1 redirect;
}
1
KeitelDOG

cyberx86の答えは私にとってはうまくいきましたが、proxy_pass行を削除し、ドル記号を取り除き、セミコロンを追加する必要がありました。私の設定への追加は次のとおりです。

    location ~ \.(gif|jpg|png) {
        try_files $uri @img_proxy;
    }

    location @img_proxy {
        rewrite ^(.*)$ /tools/image/?url=$1;
    }
0
Dean Rather