שאלה Nginx הפוכה proxy + כתובת אתר לשכתב


Nginx פועל על יציאה 80, ואני משתמש בו כדי להפוך כתובות URL של proxy עם הנתיב /foo 100 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 הפניה (שינוי כתובת האתר), אבל אני רוצה 301. מה עלי לעשות?


95
2018-04-15 17:31




אם יש לך בעיה עם מקרה Grafana אתה צריך להשתמש מתכון אלה: 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 כדי לבדוק את rewrites. שינוי מתוחכם מאוד לכלל יכול לגרום ל- nginx לבצע כתובת אתר להפניה מחדש.


118
2018-04-15 17:56



נתיב כתובת האתר עדיין מתחיל עם / foo באפליקציה שלי כשאני עושה זאת ... - jeffreyveon
חייבת להיות בעיה אחרת. שיניתי תרחיש זה בהצלחה, לפני דקות ספורות בלבד. כתובת אתר מקורית: http: // development / foo / testme / 1234 - REQUEST_URI של סקריפט PHP הפועל על Apache מחובר כמו proxy back-end: '/ testme / 1234' - Jens Bradler
את regex כנראה צריך להיות /foo(.*), אחרת example.com/foo רגיל להיות מתאימים. (וזה כנראה מה jeffreyveon מנוסים) - Benno
זה סוג של עובד, אבל הגוף שלי אני הגדרת עם proxy_set_body הוא יוסר. - Justin Thomas
rewrite / (.*) /socket.io / הפסקה; שמור את היום שלי עבור SOCKET.IO - user956584


התכונה 'קידומת מיקום פשוט' פועלת ללא שימוש בכללי כתיבה מחדש, כל עוד אתה מציין URI בהוראה proxy_pass:

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

שימו לב לתוספת / בסוף ה proxy_pass הוראה. NGINX יפשיט את הקידומת התואמת /foo ולהעביר את השאר לשרת backend ב- URI /. לכן, http://myserver:80/foo/bar יהיה לכתוב על backend ב http://localhost:3200/bar.

מ ה NGINX מסמכים על proxy_passYou

אם ההוראה proxy_pass צוינה עם URI, ולאחר מכן כאשר a   הבקשה מועברת לשרת, החלק של 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/ בצד הקדמי המתאים / על backend. אין צורך במפורש rewrite הוראה.

  • בנוסף, שים לב כי נגרר / בתוך ה location חשוב מאוד - בלי זה, אתה מסתכן בכך שיש לך כתובות אתרים מוזרות באתר שלך בשלב מסוים (למשל, עבודה /fooen בנוסף ל /foo/en).

    בנוסף, נגרר / בתוך ה location עם proxy_pass גם מבטיח כמה התעסקות מיוחדת, בהתאם לתיעוד של location הוראה, כדי לגרום בפועל משתמע location = /foo {return 301 /foo/;} גם כן.

    אז, על ידי הגדרת location עם קו נטוי נגרר כמו לעיל, אתה לא רק להבטיח כי סיומות פחות סיומות כמו כתובות /fooen לא יהיה תקף, אלא גם כי /foo ללא קו נטוי נגרר ימשיך לעבוד גם כן.


תיעוד עזר:


31
2017-08-26 21:12



זוהי התשובה הטובה ביותר כאן! - Mo Friedrich
זה נראה כמו $args אבודים: http://frontend/foo?bar=baz יהיה proxy http://backend/. שים לב כי טענות אינן חלק של כתובת האתר - Vanuan
@Vanuan, אתה בטוח בזה? אני די בטוח $args עדיין צריך להיות מטופל כראוי אם אתה משתמש בקוד לעיל, כפי שהם נפרדים $uri, וצריך להתאסף בחזרה, אלא אם אתה משתמש במשתנים מפורשים ב- proxy_pass. - cnst
@ ArchimedesTrajano, אתה לא נכון, כמו שיש טיפול מיוחד /foo לנתב מחדש אל /foo/, אז, אלא אם כן אתה עושה משהו מוזר על backend, אפילו /foo הבקשות עדיין יפעלו עם הקוד הנ"ל. (זה בעצם כבר חלק מהתשובה, BTW.) - 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