Nginx正規表示式取得uri減去位置

Nginx正規表示式取得uri減去位置

我有 Nginx 作為幾個應用程式的反向代理運行。一個位置指令正確運行,將請求發送到 unix 套接字文件,然後發送到其上游 wsgi 應用程式。我遇到問題的指令是location ~ ^/sub/alarm(.*)$。我有一些重寫似乎有效,但如果它們與我的其他意圖相衝突,我將用每個指示解釋我的意圖:

  • 第一個伺服器指令應將所有 http 重新導向到 https。這似乎工作正常。
  • 第二個伺服器指令有一個位置指令,用於將流量定向到我的 wsgi 應用程式。這很好用。其他位置指令我打算用來在/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,因為我沒有通配符證書,但想要一個簡單的捷徑和加密。這似乎工作正常。

會議:

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 中刪除位置區塊?嘗試獲取我的位置文件中 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 使用者。

此後我添加了另一個應用程式(稱為“啤酒”),它的路由方式類似於警報。我現在已經學習了正規表示式的基礎知識,並且能夠在一個位置區塊中執行此操作:

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;
}

不要介意位置區塊的順序切換。這只是打字和重新打字的巧合。

相關內容