nginx構成で$ uriからロケーションブロックを削除する方法は?


15

ngix confファイルに書き直しましたが、$ uri変数の一部としてロケーションブロックが含まれているように見えることを除いて、正常に動作します。ロケーションブロックの後にのみパスが必要です。私の現在の構成コードは次のとおりです。

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

http://localhost/cargo/testpageリダイレクトのURLの例を使用すると機能しますが、私のphpファイルが受け取る「_REWRITE_COMMAND」パラメーターの値は「/ cargo / testpage」です。ロケーションブロックを取り除き、$ uriとして「testpage」のみを取得する必要があります。

$ uriを分割し、$ 1 $ 2などを使用して新しい変数に割り当てる正規表現構文があると確信していますが、書き換えの一部ではない正規表現を使用して変数の割り当てを行うだけの例は見つかりませんステートメント。私は何時間も探してみましたが、この最後のステップを乗り越えることができないようです。

また、アプリケーションコードでこれを削除することもできますが、nginx confで修正しようとする理由は、Apacheでも実行されるため、互換性のためです。私はそれを行うための本当にハックな方法を見つけたと言うべきですが、ファイルの存在をチェックするための「if」ステートメントが含まれており、ドキュメントは具体的にはそうないと述べています。

回答:


17

周りを見ると、キャプチャで正規表現の場所を使用するのが最も簡単だと思います。あなたの例を適応させると、私は次のようになります:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

ああ、誰かがあなたにそれを指摘したらとても簡単です!ルートURLを正しい場所に書き換えるために、いくつかのマイナーリビジョンを作成する必要がありました。このコメントでは書式を設定できないため、質問に回答を掲載しました。唯一の注意点は、phpブロックがこのロケーションブロックの上にある必要があることです。そうでない場合は、無限リダイレクトループが作成されます(/ cargoが正規表現であり、リダイレクトURLにも/ cargoが含まれているため)。それが起こらないようにする別の方法があるかどうかわからない?
ジェイソン

正規表現と非正規表現の場所の順序を確認することをお勧めします。順序は一致の特異性ではなく、構成ファイル内の順序によって決定されるため、通常、ある時点ですべての場所を正規表現にします。
Theuni

おかげで、上記の正規表現が/cargo/(index.php以外のもの)に一致する場合、無限の書き換えループによるサーバーエラーを防ぐことができると想像していました。
ジェイソン

3

私のために働いた別のものを見つけました(gunicornを使用しているので、渡すものを選択できません)

あなたは逃げることができるはずです

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

Node JSでマイクロサービスまたはAPIに追加するのに苦労しているかもしれない人のために、次を使用apiしてサーバー上のURL から削除しました。

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.