web-dev-qa-db-ja.com

末尾のスラッシュがある場合とない場合のnginxの場所

http://example.comhttp://example.com/ の両方をキャッチする場所と、その他すべてをキャッチする別の場所を作成したいと思います。最初のものは静的HTMLを提供し、もう1つはAPIやその他のもののためのものです。私はこれで試しました:

location ~ /?$ {
    root /var/www/prod/client/www;
}

location ~ /.+ {
    # https://stackoverflow.com/questions/21662940/nginx-proxy-pass-cannot-have-uri-part-in-location
    rewrite ^/(.*) /$1 break;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_Host;
    proxy_set_header X-NginX-Proxy true;

    proxy_connect_timeout       1s;
    proxy_send_timeout          30s;
    proxy_read_timeout          300s;
    send_timeout                300s;

    proxy_redirect off;
    proxy_pass http://backendPro;
}

しかし、動作しません。私は最初の場所で多くのオプションを試しましたが、最初に一致した場合、2番目は一致しません。その逆も同様です。

location / {
location ~ \/?$ {
location ~ ^/?$ {
4
Miquel

実際にははるかに簡単です。

location = / {
  # Exact domain match, with or without slash
}

location / {
  # Everything except exact domain match
}

なぜならlocation = /はより具体的であり、ドメイン名のみが呼び出される場合は常に優先されます(ロケーションブロックの順序は重要ではありません)。

通常のロケーションブロックは先頭に一致するすべてのURLに一致するため、Nginxで必要な正規表現は思ったよりもはるかに少なくなります。したがってlocation /blaは、/ blaで始まるドメイン上のすべてのURLに一致します(/ blabla、/ bla/blu、または/bla.jpgなど)。グループをキャプチャしてそれらを使用して何かを行う必要がある場合は、主に正規表現をお勧めします。

4
iquito