سؤال Nginx reverse proxy + URL rewrite


تعمل Nginx على المنفذ 80 ، وأنا أستخدمه لعكس عناوين URL للخادم الوكيل باستخدام المسار /foo الى المرفئ 3200 من هنا:

location /foo {
                proxy_pass http://localhost:3200;
                proxy_redirect     off;
                proxy_set_header   Host $host;
}

هذا يعمل بشكل جيد ، ولكن لدي تطبيق على المنفذ 3200، والتي لا أريد الأولية /foo ليتم إرسالها إلى. هذا هو - عندما أكون الوصول http://localhost/foo/barاريد فقط /bar ليكون المسار كما وردت من قبل التطبيق. لذلك حاولت إضافة هذا الخط إلى كتلة الموقع أعلاه:

rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;

يؤدي هذا إلى إعادة توجيه 302 (التغيير في عنوان URL) ، ولكن أريد 301. ماذا أفعل؟


95
2018-04-15 17:31


الأصل


إذا كان لديك أي مشكلة في حالة جرافانا يجب عليك استخدام هذه الوصفة: docs.grafana.org/installation/behind_proxy/... - mohsen saeedi


الأجوبة:


لا معنى لأي إعادة توجيه إلى localhost من نظام بعيد (مثل متصفح الويب الخاص بالعميل). لذلك إعادة كتابة الأعلام دائمة (301) أو إعادة توجيه (302) غير قابلة للاستخدام في قضيتك.

الرجاء محاولة اتباع الإعداد باستخدام قاعدة إعادة كتابة شفافة:

location  /foo {
  rewrite /foo/(.*) /$1  break;
  proxy_pass         http://localhost:3200;
  proxy_redirect     off;
  proxy_set_header   Host $host;
}

استعمال curl -i لاختبار إعادة كتابتك. يمكن أن يتسبب التغيير الدقيق جدًا في القاعدة في إجراء nginx لإجراء إعادة توجيه.


118
2018-04-15 17:56



ما زال مسار عنوان URL يبدأ بـ / foo في تطبيقي عندما أقوم بذلك ... - jeffreyveon
يجب أن تكون هناك مشكلة مختلفة. أنا استنسخت هذا السيناريو بنجاح ، قبل دقائق فقط. عنوان URL الأصلي: HTTP: // تنمية / فو / testme / 1234 - REQUEST_URI للنص البرمجي لـ PHP الذي يعمل على Apache متصلاً كجهة طرفية للوكيل: '/ testme / 1234' - Jens Bradler
يجب أن يكون التعبير المعتاد على الأرجح /foo(.*)، غير ذلك example.com/foo لن تكون متطابقة. (وهو على الارجح ما جيفرييفون من ذوي الخبرة) - Benno
هذا النوع من الأعمال ، ولكن جسدي أنا الإعداد مع proxy_set_body تتم إزالته. - Justin Thomas
rewrite /(.*) /socket.io/ break؛ وفر لي في يوم SOCKET.IO - user956584


تعمل مطابقة بادئة الموقع البسيط لهذا دون استخدام قاعدة rewrite طالما قمت بتحديد URI في توجيه proxy_pass:

location /foo {
  proxy_pass http://localhost:3200/;
}

لاحظ الإضافي / عند نهاية ال proxy_pass التوجيه. سوف NGINX تجريد البادئة المتطابقة /foo وتمرير الباقي إلى خادم الخلفية في URI /. وبالتالي، http://myserver:80/foo/bar سوف ينشر إلى الخلفية في http://localhost:3200/bar.

من مستندات NGINX على proxy_pass:

إذا تم تحديد توجيه proxy_pass باستخدام معرف URI ، فعندئذ يتم تحديد   يتم تمرير الطلب إلى الخادم ، جزء من URI طلب عادي   يتم استبدال المطابقة بالموقع بواسطة URI المحدد في التوجيه:


88
2017-09-29 03:30



يعمل لي مما أضفته / إلى الموقع / foo / { - Andrei N
كان هذا بالضبط ما كنت أبحث عنه! - anbiniyar
هذا حل نظيف للغاية ، أفضل أن يكون هذا هو الجواب القانوني على السؤال. - ralien
استغرق وقتًا طويلاً لتحقيق أهمية الحفاظ على القطع المائلة أو إزالتها. - Parvez
هذا سوف يمر فعلا //xyz إلى المضيف إذا فعلت ذلك. - Archimedes Trajano


الطريقة المثلى الصحيحة وأفضل الممارسات عادة ما تكون على النحو التالي:

location /foo/ {
    proxy_pass http://localhost:3200/; # note the trailing slash!
}

  • لاحظ الأهمية البالغة لل علامة مائلة لاحقة proxy_passوالذي يغير تلقائيا $uri متغير أن يكون /foo/ على الواجهة الأمامية تتوافق مع / على الخلفية. لا حاجة لصريح rewrite التوجيه.

  • بالإضافة إلى ذلك ، لاحظ أن زائدة / في ال location مهم جدًا أيضًا ، وبدون ذلك ، تخاطر بعناوين URL ذات مظهر غريب على موقعك في مرحلة معينة (على سبيل المثال ، العمل /fooen بالإضافة إلى /foo/en).

    بالإضافة إلى ذلك ، زائدة / في ال location مع proxy_pass يضمن أيضا بعض تعامل خاصحسب وثائق ال location التوجيه ، لتتسبب بشكل فعال في ضمني location = /foo {return 301 /foo/;} كذلك.

    لذلك ، من خلال تحديد location باستخدام الشرطة المائلة كما هو موضح أعلاه ، فأنت لا تضمن فقط أن عناوين URL لاحقة أقل /fooen لن تكون صالحة ، ولكن أيضًا /foo بدون شرطة مائلة تستمر في العمل أيضًا.


الوثائق المرجعية:


31
2017-08-26 21:12



هذا هو أفضل إجابة هنا! - Mo Friedrich
يبدو مثل $args ضائعون: http://frontend/foo?bar=baz سيتم proxied ل http://backend/. لاحظ أن args ليست جزء من عنوان url - Vanuan
Vanuan ، هل أنت متأكد من ذلك؟ أنا متأكد جدا $args لا يزال يجب التعامل معها بشكل مناسب إذا كنت تستخدم الرمز أعلاه ، كما هي منفصلة عن $uriويجب أن يتم تجميعها مرة أخرى ، إلا إذا كنت تستخدم متغيرات صريحة في proxy_pass. - cnst
ArchimedesTrajano ، أنت غير صحيح ، لأن هناك معالجة خاصة لـ /foo لإعادة التوجيه إلى /foo/لذلك ، إلا إذا كنت تفعل شيء غريب على الخلفية ، حتى /foo ستظل الطلبات تعمل مع الرمز أعلاه. (هذا بالفعل جزء من الجواب ، راجع للشغل). - cnst
هذا هو أفضل إجابة! هذا يجب أن يتحرك. - phegde


محاولة

location /foo {
    proxy_pass http://localhost:3200/;
    ....

أو

location ^~ /foo {
    proxy_pass http://localhost:3200/;
    ....

0
2018-01-21 16:20



ستكون هذه الإجابة جيدة إذا أعطيت بعض التفسير لماذا يجب تهيئتها كما هو موضح أعلاه. - masegaloeh
هذا سوف يمر فعلا //xyz إلى المضيف إذا فعلت ذلك. - Archimedes Trajano