এনজিঙ্ক্স বিপরীত প্রক্সিতে কীভাবে সেট-কুকির ডোমেন অংশটি পুনরায় লেখতে হয়?


26

আমার একটি সাধারণ এনগিনেক্স বিপরীত প্রক্সি রয়েছে:

server {
  server_name external.domain.com;
  location / {
    proxy_pass http://backend.int/;
  }
}

সমস্যাটি হ'ল Set-Cookieপ্রতিক্রিয়া শিরোনামগুলিতে রয়েছে ;Domain=backend.int, কারণ ব্যাকএন্ড জানে না এটি বিপরীত দিকে প্রক্স করা হচ্ছে।

আমি কীভাবে এনজিঞ্জকে Set-Cookieপ্রতিক্রিয়া শিরোনামগুলির বিষয়বস্তুটি পুনরায় লিখন করে এর ;Domain=backend.intসাথে প্রতিস্থাপন করতে ;Domain=external.domain.comপারি?

Hostএই ক্ষেত্রে শিরোনামটি অপরিবর্তিতভাবে পাস করা কোনও বিকল্প নয়।

অ্যাপাচি httpd এর কিছুক্ষণের জন্য এই বৈশিষ্ট্যটি রয়েছে, দেখুন ProxyPassReverseCookieDomain, তবে আমি এনজিএনএক্সে এটি করার কোনও উপায় খুঁজে পাচ্ছি না।


2
হোস্ট শিরোলেখ পাস করা কেন একটি বিকল্প নয়? imo এর শিরোনামের হোস্ট অংশটি এই জাতীয় জিনিসগুলির জন্য তৈরি। কোন প্রক্সি ব্যবহার করা হয়েছে তা যদি আপনাকে পাস করতে হয় তবে আপনার অতিরিক্ত শিরোনাম সরবরাহ করতে হবে।
jojoo

1
মনে করুন আপনার কাছে একটি লিগ্যাসি সার্ভার রয়েছে যা ভার্চুয়াল হোস্টিং করে এবং আপনি Nginx এর সামনে রাখতে চান, সেগুলির কিছুটি একটি নতুন ডোমেনে প্রকাশ করতে। মনে করুন আপনিও লিগ্যাসি সার্ভারের কনফিগারেশনটি পরিবর্তন করতে পারবেন না (বা চান না)। কুকি ডোমেন ইস্যু ব্যতীত নতুন সাইটগুলিতে লিগ্যাসি পরিষেবাদি প্রকাশের জন্য প্রয়োজনীয় সমস্ত সরঞ্জামগুলিতে এনগিনেক্স রয়েছে।
টোবিয়া

উত্তর:



5

@ শামার থেকে উত্তর একাধিক Set-Cookieপ্রতিক্রিয়া শিরোনামের সাথে ভাল কাজ করে, তবে কেবলমাত্র একটি থাকলে এটি ব্যর্থ হয়। এজেন্ট যেমন রেফারেন্সড থ্রেডের শেষে নির্দেশ করে, if type(cookies) ~= "table" then cookies = {cookies} endসেই ক্ষেত্রে পরিচালনা করার জন্য প্রয়োজনীয়।

পুরো বিষয়টি এখানে:

location / { 
    proxy_pass http://backend.int/;

    header_filter_by_lua '
        local cookies = ngx.header.set_cookie 
        if not cookies then return end
        if type(cookies) ~= "table" then cookies = {cookies} end
        local newcookies = {}
        for i, val in ipairs(cookies) do
            local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+", 
                      "%1=external.domain.com") 
            table.insert(newcookies, newval) 
        end 
        ngx.header.set_cookie = newcookies 
    '; 
}

2

এই প্রশ্নটি এনজিনেক্স মেলিং তালিকায় উঠে এসেছে [1]। এনজিনেক্সে সরাসরি এটি করার কোনও উপায় নেই। আপনাকে ngx_lua মডিউল (> = v0.3.1) ব্যবহার করতে হবে res

ব্যবহারকারী "এজেন্টজ" এর উদাহরণটি রয়েছে যা কনফিগার ফাইলে অন্তর্ভুক্ত হতে পারে:

    server_name external.domain.com; 

    location / { 
        proxy_pass http://backend.int/;

        header_filter_by_lua ' 
            local cookies = ngx.header.set_cookie 
            if not cookies then return end 
            local newcookies = {} 
            for i, val in ipairs(cookies) do 
                local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+", 
                          "%1=external.domain.com") 
                table.insert(newcookies, newval) 
            end 
            ngx.header.set_cookie = newcookies 
        '; 
    } 

[1] http://nginx.2469901.n2.nabble.com/Rewriting-the-domain-part-of-Set-Cookie-in-a-proxy-pass-td6453554.html


2
সঠিক উত্তরের জন্য আপনাকে ধন্যবাদ, যদিও আমি অতীতে ngx_lua এর সাথে খারাপ অভিজ্ঞতা পেয়েছিলাম: খারাপ স্মৃতিশক্তি ফাঁস। আমি মনে করি Nginx এর বিল্টিন রিজএক্সএক্স ইঞ্জিন ব্যবহার করে কিছু সাধারণ হেডার ম্যানিপুলেশন আদিম প্রয়োজন, যদি না কুকি ডোমেন পুনরায় লেখার মতো আরও কয়েকটি কাস্টম নির্দেশাবলী না থাকে।
টোবিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.