হোস্ট পোর্ট! = ধারক পোর্ট যখন ডগার মেশিনে এনগিনেক্স পুনর্লিখন rite


10

আমি 80 পোর্টে সমস্ত চলমান এনজিনেক্স শুনার জন্য একাধিক ডকার পাত্রে চালানোর চেষ্টা করছি, তবে বিভিন্ন হোস্ট পোর্টগুলি 80 টি পাত্রে পোর্টে ম্যাপিংয়ের মাধ্যমে।

বেশিরভাগ অংশে এটি কাজ করে, যখন একটি পিছনের স্ল্যাশ হারিয়ে যাওয়ার কারণে এনজিনেক্স পুনর্নির্দেশ করে।

server {
    listen 80;
    root /var/www;
    index index.html;
    location /docs {}
}

উপরের এনজিনেক্স কনফিগারেশন এবং একটি ডকার পাত্রে এটি হোস্ট পোর্ট ৮০৮০ সহ ম্যাপযুক্ত কনটেইনার পোর্ট ৮০ দিয়ে লোকাল হোস্ট পেতে পারি: 8080 / ডক্স / কার্ল ঠিক আছে:

> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...

তবে যদি আমি লোকালহোস্টের অনুরোধ করি: 8080 / ডক্স আমি লোকালহোস্ট / ডক্স / এ পুনঃনির্দেশ পাই

> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...

পুনঃনির্দেশ করার সময় আমি কীভাবে মূল পোর্টটি সংরক্ষণ করার জন্য এনজিনেক্স পেতে পারি? আমি পোর্ট_ইন_আরডাইরেক্ট এবং সার্ভার_নাম_ইন_রেড্রেট দেখার চেষ্টা করেছি কিন্তু তারা সাহায্য করেনি।


সম্পাদনা

Https://forum.nginx.org/read.php?2,261216,261216#msg-261216 এর উপর ভিত্তি করে এখনই এটি সম্ভব দেখাচ্ছে না।


এনগিনেক্স-প্রক্সি ধারকটি দেখুন , যাতে আপনাকে এই উন্মাদ পোর্টটির পুনর্লিখন জাঙ্কের কোনও কাজ করতে হবে না।
মাইকেল হ্যাম্পটন

আমি এই ধারকগুলির সামনে সামঞ্জস্যপূর্ণ কিছু চাই না। আমি একটি ডকার-রচনা ফাইল পেয়েছি যা একটি এনভির ভারের উপর ভিত্তি করে বাহ্যিক বন্দর নির্ধারণ করে এবং বেশিরভাগ সময় আমি কেবল এই ফাইলটি একবার "ডকার-কমপোজ-ডি" করি। তবে পরীক্ষার কারণগুলির জন্য এবং অন্যান্য জিনিসগুলিতে আমাকে কাজ করার অনুমতি দেওয়ার জন্য আমি সম্পূর্ণ নতুন ধারক কাটানোর জন্য "পোর্ট = 8080 ডকার-কমপোজ-পি পরীক্ষা আপ-ডি" করতে সক্ষম হতে চাই (নতুন প্রকল্পের নামের কারণে) ) যা অন্য কোনও হোস্ট পোর্টে ম্যাপ করা থাকে।
ইবসা

হ্যাঁ, এই সমস্যাটিও সবেমাত্র চালানো হয়েছে। আমার ধারণা, আমাকে ভ্যানিলা এনজিনেক্সে যেতে হবে বা 8080 এ স্টাফ অন্য কোনও জায়গায় নিয়ে যেতে হবে।
কেন

উত্তর:


2

সবচেয়ে সহজ সমাধান হ'ল indexনির্দেশকে সরিয়ে ফেলা এবং সুস্পষ্ট বা অন্তর্নিহিত $uri/পুনঃনির্দেশগুলির উপর নির্ভর না করা । উদাহরণ স্বরূপ:

server {
  listen 80;
  root /var/www;
  location /docs {
    try_files $uri $uri/index.html =404;
  }
}

এটি সম্পূর্ণরূপে পুনঃনির্দেশকে এড়িয়ে যাওয়ার কারণে এটি অভিন্ন আচরণ নয়। যদি আপনি সূচক মডিউলের মতো একটি পিছনে স্ল্যাশ পুনর্নির্দেশ চেয়েছিলেন তবে আরও জটিল সমাধান প্রয়োজন। উদাহরণ স্বরূপ:

server {
  listen 80;
  root /var/www;
  location /docs {
    try_files $uri @redirect;
  }
  location @redirect {
    if ($uri ~* ^(.+)/$) { rewrite ^ $uri/index.html last; }
    if (-d $document_root$uri) { return $scheme://$host:8080$uri/; }
    return 404;
  }
}

আমি যে প্রশ্নটিতে বলেছি যে আমি এটি চেষ্টা করেছি, আমি পোর্ট_ ইন_ড্রেইটকে অফ করেছি; লোকালহোস্ট / ডক্স / এ পুনঃনির্দেশের একই ফলস্বরূপ, ব্লকটিতে সার্ভার_নাম_ইন_রেড্রাইট বন্ধ করার চেষ্টা করা হয়েছে; যেমন. এখনও লোকালহোস্ট / ডক্স /
ইবাসা

@ ইবাসা হ্যাঁ, সে সম্পর্কে দুঃখিত। দুবার পড়ুন - একবার লিখুন। এটা মনে রাখার চেষ্টা করতে হবে।
রিচার্ড স্মিথ

5

এইচটিটিপি ক্লায়েন্টরা পোর্টটি হোস্ট শিরোনামে রাখবে। আপনি যদি পুনর্নির্দেশ করার সময় হোস্ট শিরোনামের মূল মানটি ব্যবহার করেন তবে এটি প্রত্যাশা অনুযায়ী কাজ করা উচিত। আমি নিম্নলিখিত কোডটি পরীক্ষা করে দেখেছি যা আপনি অনুরোধ করেছেন ঠিক তেমনই করছে:

location ~ ^.*[^/]$ {
    try_files $uri @rewrite;
}
location @rewrite {
    return 302 $scheme://$http_host$uri/;
}

> GET /bla HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.9.7
< Date: Sun, 29 Nov 2015 06:23:35 GMT
< Content-Type: text/html
< Content-Length: 160
< Connection: keep-alive
< Location: http://localhost:8080/bla/

এটি প্রযুক্তিগতভাবে সঠিক উত্তর। এটি আইপিগুলির সাথেও কাজ করে, উদাহরণস্বরূপ 127.0.0.1:8000 এর জন্য একটি অনুরোধের 127.0.0.1:8000 http_host হিসাবে থাকবে। : এটা এ কারণে যে অনুযায়ী tools.ietf.org/html/rfc2616#section-14.23 http_host ambiguousity জন্য খাদ্যাদি, যা করার জন্য একটি বন্দর যোগ হবে প্রয়োজন। যদি পোর্টগুলি ছেড়ে যায় তবে ডিফল্টগুলি অন্তর্ভুক্ত থাকে (উদাহরণস্বরূপ 80 বা 443 হয়)। সুতরাং এই সমাধানটি কাজ করা সবচেয়ে পরিষ্কার হওয়া উচিত ...
Lifeofguenter


0

আকর্ষণীয় ... আমি এই সমস্যাটির সাথে স্পষ্টভাবে মুখোমুখি হয়েছি এবং রিচার্ড স্মিথের উত্তর অনুসারে এটিকে ঠিক করতে সক্ষম হয়েছি :

root /var/www;
location = /docs {
    try_files $uri $uri/ =404;
}

পার্থক্য কেবলমাত্র আমি নির্দিষ্ট করে দিই না index.html?

একটি পুনর্নির্দেশ লুপ এড়াতে ত্রুটি কোড নির্দিষ্ট করুন।

এখনও nginx এর সমর্থন থেকে প্রতিক্রিয়া জন্য অপেক্ষা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.