場所を除いた URI を取得するための Nginx 正規表現

場所を除いた URI を取得するための Nginx 正規表現

私はNginxをいくつかのアプリケーションへのリバースプロキシとして実行しています。1つのロケーションディレクティブは正常に実行されており、リクエストをUnixソケットファイルに送信し、その後上流のwsgiアプリに送信します。問題のあるディレクティブは次のとおりです。location ~ ^/sub/alarm(.*)$うまく機能しているように見える書き直しがいくつかありますが、他の意図と衝突する可能性があるため、各ディレクティブの意図を説明します。

  • 最初のサーバー ディレクティブは、すべての http を https にリダイレクトする必要があります。これは正常に動作するようです。
  • 2番目のサーバーディレクティブには、トラフィックをWSGIアプリケーションに誘導するロケーションディレクティブが1つあります。これは正常に動作します。もう1つのロケーションディレクティブは/home/myuser/alarm.example.com/GETを受信したときに静的コンテンツを提供するために使用するつもりでしたexample.net/sub/alarm(例: example.net/sub/alarm/pretty.css は /home/myuser/alarm.example.com/pretty.css を渡す必要があります) 代わりに、wsgi アプリが読み込まれます。
  • 最後のサーバー ディレクティブは、alarm.example.net を example.net/sub/alarm にリダイレクトする必要があります。これは、ワイルドカード証明書を持っていないが、簡単なショートカットと暗号化を望んでいたためです。これは正常に動作するようです。

conf:

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name example.com www.example.com;
    rewrite ^/(.*) https://example.com/$1 permanent;
}

server {
        listen 443 ssl;
        listen [::]:443 ipv6only=on ssl;
        charset utf-8;
        client_max_body_size 75M;
        server_name example.com www.example.com;
        ssl_certificate /etc/ssl/certs/example.com.crt;
        ssl_certificate_key /etc/ssl/private/example.com.key;

        location / {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/example.com.sock;
        }

        location ~ ^/sub/alarm(.*)$ {
                alias /home/appusername/alarm.example.com;
                index index.html;
                try_files $1 $1/;
        }
}

server {
        listen 80;
        server_name alarm.example.com;
        rewrite ^ $scheme://example.com/sub/alarm$request_uri permanent;
}

私は見たnginx 構成の $uri から location ブロックを削除するにはどうすればいいですか?URI の後にある場所ファイルの部分を取得しようとしています。優先順位について何か見落としていると思います。

もう一つの試み正規表現なし:

location /sub/alarm/ {
        alias /home/appusername/alarm.example.com;
        index index.html;
        try_files $uri $uri/index.html =404;
}

上記のケースでは、alarm.example.comにアクセスしたときにindex.htmlを読み込むことができました(正しくリダイレ​​クトされました)https://example.com/sub/alarm/) ですが、すべてのリソースが 404 を返していました。

最終的に、両方の試みを組み合わせようとしましたが、ロケーション ブロック内にチルダを配置できないようです (Nginx をリロードするときに「不明なディレクティブ」)。

location /sub/alarm/ {
        ~ ^/sub/alarm(.)$
        try_files /home/appusername/alarm.example.com$1 /home/appusername/alarm.example.com$1/;
}

その他の注意事項

  • example.com の動的アプリは、静的な「アラーム」アプリとはまったく関係ありません。正規表現を試みると、アラーム アプリの代わりにこのアプリが提供されるという理由だけで含まれています。
  • 私は正規表現について学ぶことを避けてきました(おそらく賢明ではないでしょうが、過去7年間で今日まで実際に必要になったことはありませんでした)。そして、Nginxを設定するときにその代償を払っています。正規表現101正規表現の文字列 を取得します^\/sub\/alarm(.*)$。エスケープ スラッシュを使用する必要があることを示しているようですが、Nginx の例ではそれが示されていないようです。他に学習する必要がある概念がある場合はお知らせください。今日から、正規表現を避ける姿勢を正式に終了します。
  • 構文が Nginx をリロードするのに十分有効であれば、2015/10/12 20:25:57 [notice] 30500#0: signal process startedすべての試行でエラーが発生していました。

答え1

つまり、ユーザー (えっと...私) は、明白な手がかりとなるはずの何かを見逃したのです。

上記のケースでは、alarm.example.comにアクセスしたときにindex.htmlを読み込むことができました(正しくリダイレ​​クトされました) https://example.com/sub/alarm/) ですが、すべてのリソースが 404 を返していました。

その例はまだ正しくなかったが、私はリソースファイルのファイル権限を確認する必要がありますNginx は www-data として実行されており、index.html ファイルのグループに属していますが、すべてのファイルのグループに属している必要があります。ファイルの所有者は appusername ユーザーです。

その後、アラームのようにルーティングされる別のアプリ (「ビール」という名前) を追加しました。正規表現の基本を学んだので、これを 1 つのロケーション ブロックで実行できるようになりました。

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name example.com www.example.com;
    rewrite ^/(.*) https://example.com/$1 permanent;
}

server {
        listen 443 ssl;
        listen [::]:443 ipv6only=on ssl;
        charset utf-8;
        client_max_body_size 75M;
        server_name example.com www.example.com;
        ssl_certificate /etc/ssl/certs/example.com.crt;
        ssl_certificate_key /etc/ssl/private/example.com.key;
        error_log /var/log/nginx/error.log warn;

        location ~ ^/sub/(alarm|beer)(.*)$ {
                alias /home/appusername/$1.example.com/;
                #index  index.html index.htm;
                try_files $2 $2/ =404;
        }

        location / {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/example.com.sock;
        }
}

server {
        listen 80;
        server_name alarm.example.com;
        rewrite ^ $scheme://example.com/sub/alarm$request_uri permanent;
}

ロケーション ブロックの順序の切り替えは気にしないでください。これは、入力と再入力の単なる偶然です。

関連情報