nginx關於root與alias的區別

情商變高發表於2019-01-19

結論

配置demo:

location xxx {
    root yyy
}

瀏覽器訪問 xxx,實際訪問的是 yyy/xxx
瀏覽器訪問 xxx/abc.html,實際訪問的是 yyy/xxx/abc.html
瀏覽器訪問 xxx/ccc/abc.html,實際訪問的是 yyy/xxx/ccc/abc.html

結論: root屬性,會把root的值(這裡是yyy)加入到訪問路徑(locaition)之前

配置demo:

locaiton xxx {
    # alias必須以 / 結束,否則無效
    alias yyy/ 
}

瀏覽器訪問 xxx,實際訪問的是 yyy
瀏覽器訪問 xxx/abc.html,實際訪問的是 yyy/abc.html
瀏覽器訪問 xxx/ccc/abc.html,實際訪問的是 yyy/ccc/abc.html

結論:alias屬性,會把alias的值(這裡是yyy)替代訪問路徑匹配的部分(這裡是xxx)

示例

nginx的目錄結構如下:

nginx/
    -html/
        -index.html
    -logs/
        - access.log
    -conf/
        -nginx.conf

1) 這種配置,http://localhost:8086/access.log,能看到 nginx/logs/access.log,但就別指望能訪問 html目錄下的文件了

server {
    listen       8086;
    server_name  localhost;
    location / {
        root   logs;
    }
}

2) 這種配置,訪問 http://localhost:8086/log/access.log,能看到 nginx/logs/access.log;
訪問 http://localhost:8086/, 能看到 nginx/html/index.html

server {
    listen       8086;
    server_name  localhost;
    location / {
        root   html;
        index  index.html index.htm;
    }
    # 配置成 location /log/ 或 location /log 都可以
    location /log/ {
        # 不能寫成logs, 必須已 / 結束
        alias logs/;
        # 以下配置沒用也可以,只是方便你輸入 localhost:8086/log/ 後能,看到nginx/logs/目錄下的所有檔案
        autoindex on;
    }
}

3) 這種配置,訪問 http://localhost:8086/logs/access.log,能看到 nginx/logs/access.log;
訪問 http://localhost:8086/, 能看到 nginx/html/index.html

server {
    listen       8086;
    server_name  localhost;
    # http://localhost:8086/ 訪問的是
    # nginx/html/  (然後會自動顯示 index.html 或 index.htm,如果存在這兩個檔案之一)
    # 囉嗦的註釋: nginx/html(html是root的值)/(/是location的值)
    location / {
        root   html;
        index  index.html index.htm;
    }
    # http://localhost:8086/logs/ 訪問的是
    # nginx/./logs/
    # .是root的值,logs是location的值
    # 請與第4種錯誤配置進行比較,深入理解root屬性
    location /logs/ {
        # 寫成./也可以
        root .;
    }
}

4) 錯誤的配置

server {
    listen       8086;
    server_name  localhost;
    location / {
        root   html;
        index  index.html index.htm;
    }
    # 這樣子配置是錯的, 請與第三種配置比較一下
    # 關鍵點:root屬性會把root的值加入到最終路徑之前
    # 即: http://localhost:8086/logs/access.log訪問的是:
    # nginx/logs/logs/access.log
    # 因為: nginx/logs(root的值)/logs(locaition的值)/access.log,
    location /logs/ {
        root /logs/;
    }
}

節選:https://www.cnblogs.com/zhang… 這段話:
root屬性指定的值是要加入到最終路徑的,所以訪問的位置變成了 root的值/locaiton的值。而我不想把訪問的URI加入到路徑中。所以就需要使用alias屬性,其會拋棄URI,直接訪問alias指定的位置

參考:
https://www.cnblogs.com/zhang…
https://www.cnblogs.com/kevin…

相關文章