nginx: Mengapa saya tidak bisa memasukkan proxy_set_header di dalam klausa if?

9

Dengan konfigurasi ini:

server {
    listen 8080;
    location / {
        if ($http_cookie ~* "mycookie") {
            proxy_set_header X-Request $request;
            proxy_pass http://localhost:8081;
        }
    }
}

Saya memiliki kesalahan ini ketika saya memuat kembali layanan nginx:

Reloading nginx configuration: nginx: [emerg] "proxy_set_header" directive is not allowed here in /etc/nginx/conf.d/check_cookie.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed

Konfigurasi ini berfungsi baik, tetapi tidak melakukan apa yang saya inginkan:

server {
    listen 8080;
    location / {
        proxy_set_header X-Request $request;
        if ($http_cookie ~* "mycookie") {
            proxy_pass http://localhost:8081;
        }
    }
}

Mengapa saya tidak bisa memasukkan direktif proxy_set_header di dalam klausa if?

Neuquino
sumber
Tolong jangan posting silang. stackoverflow.com/questions/16500594/…
ceejayoz
Saya membuka obrolan untuk membahas hal ini. Kita dapat melanjutkan diskusi di sana: chat.stackexchange.com/rooms/8745/nginx
Neuquino

Jawaban:

10

Dengan asumsi Anda sebenarnya bermaksud bertanya, 'bagaimana saya bisa membuat ini bekerja', bagaimana kalau hanya menulis ulang sehingga header selalu disahkan, tetapi mengaturnya ke beberapa nilai yang diabaikan jika Anda tidak ingin itu diatur.

server {
    listen 8080;    
    location / {
        set $xheader "someignoredvalue";

        if ($http_cookie ~* "mycookie") {
            set $xheader $request;
        }

        proxy_set_header X-Request $xheader;

        if ($http_cookie ~* "mycookie") {
            proxy_pass http://localhost:8081;
        }
    }
Danack
sumber
Maksudmu ""benar?
Michael Hampton
2
Saya pribadi lebih suka mengatur sesuatu menjadi jelas bukan nilai nyata, daripada berpotensi lupa bahwa peretasan ini ada, dan kemudian bertanya-tanya mengapa header itu kosong. Jika diset ke "X-Header-not-set-by-nginx" maka Anda tidak akan pernah bingung.
Danack
Menurut artikel ini: nginx.com/resources/wiki/start/topics/depth/ifisevil . Satu-satunya hal yang aman 100% yang dapat dilakukan di dalam jika dalam konteks lokasi adalah kembali dan menulis ulang. Saya ragu proxy_pass jika blok akan selalu berfungsi.
Chau Chee Yang