自定義HTTP頭時的注意事項(轉)


 

原文:https://blog.gnuers.org/?p=462

HTTP頭是可以包含英文字母([A-Za-z])、數字([0-9])、連接號(-)hyphens, 也可義是下划線(_)。在使用nginx的時候應該避免使用包含下划線的HTTP頭。主要的原因有以下2點。
1.默認的情況下nginx引用header變量時不能使用帶下划線的變量。要解決這樣的問題只能單獨配置underscores_in_headers on。
2.默認的情況下會忽略掉帶下划線的變量。要解決這個需要配置ignore_invalid_headers off。

當然,nginx設置變量的時候是沒有任何這樣的限制的,可以直接設置帶下划線的header。但是最好不要這樣做。在使用nginx做多級代理的 時候,也需要注意一些header不要重復設置。比如用來保存用戶IP的這個header只在最上層的nginx里配置就行,后面的nginx不要重復設 置導致覆蓋。

簡單測試一下多個nginx做代理的時候處理的思路,為了方便我就直接在一個nginx上跑多個server測試

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$http_orig_client_ip - $remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"  "$upstream_addr" ';
    sendfile        on;
    underscores_in_headers on;
    ignore_invalid_headers  off;
    keepalive_timeout  65;
 upstream test2081{
    server 10.209.128.28:2081;
}
 upstream test2082{
    server 10.209.128.28:2082;
}
 upstream test2083{
    server 10.209.128.28:80;
}
    server {
        listen       2080;
        server_name  localhost;
        access_log  logs/access80.log  main;
        location / {
            root   html;
        proxy_set_header ORIG_CLIENT_IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-By $server_addr:$server_port;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_pass http://test2081;
        }
    }
    server {
        listen       2081;
        server_name  localhost;
        access_log  logs/access81.log  main;
        location / {
            root   html;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-By $server_addr:$server_port;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_pass http://test2082;
        }
    }
    server {
        listen       2082;
        server_name  localhost;
        access_log  logs/access82.log  main;
        location / {
            root   html;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-By $server_addr:$server_port;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_pass http://test2083;
        }
    }
}

 

 

server 2080收到請求后會設置一個不規范的HTTP頭,后面連接了2段server。發起請求后,日志如下

 

可以看到2081和2082的都是能正確傳遞好這個header的(包括機器上80端口跑的也是可以的)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM