我需要在作為代理的 nginx 中執行一些條件操作。基本上,這一切都歸結為能夠從外部來源設定一些 nginx 變數。它可以是 bash 腳本或由 url 產生的結果或類似的東西。
例如:
set $var = [result of http request]
或者
set $var = [result of bash command]
對此有可靠的解決方案嗎?模組?如果使用 nginx 不是個好主意,還有什麼替代方案?
答案1
解決方案是使用lua模組執行簡單的lua腳本來執行必要的處理。簡單的例子:
location / {
# Get device type from lua script.
# Note: do not use content_by_lua as it's executed in separate context.
set_by_lua_file $device_type 'device-detect.lua';
# Do what needs to be done...
}
lua 腳本傳回的任何內容都位於$device_type
變數內。
需要記住的重要一點是,在大多數 Linux 發行版上,lua 模組是 nginx-extras 套件的一部分,必須安裝它而不是標準的 nginx-core。
答案2
Nginx 有很多內建變數[1] 你可以使用這樣的東西:
#Default to EN
set $vislang "EN";
#Discriminate language
if ($http_accept_language ~* "^fr") {
set $vislang "FR";
}
基於 bash 的解決方案可能是“sed -i nginx_conf_file && service nginx reload”,但我認為它不是很乾淨。
[1]http://nginx.org/en/docs/http/ngx_http_core_module.html#variables