http://example.com と http://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 ~ ^/?$ {
実際にははるかに簡単です。
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など)。グループをキャプチャしてそれらを使用して何かを行う必要がある場合は、主に正規表現をお勧めします。