Nginx ප්‍රතිවිකුණුම් ප්‍රොක්සි + URL නැවත ලිවීම


175

Nginx වරාය 80 හි ක්‍රියාත්මක වන අතර, මම මේ ආකාරයෙන් /fooවරාය වෙත ප්‍රොක්සි URL ආපසු හැරවීමට භාවිතා කරමි 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 අවශ්‍යයි. මා කළ යුත්තේ කුමක්ද?


1
ඔබට ග්‍රැෆනා නඩුවේ කිසියම් ගැටළුවක් ඇත්නම් ඔබ මෙම වට්ටෝරුව භාවිතා කළ යුතුය: docs.grafana.org/installation/behind_proxy/…
mohsen saeedi

Answers:


192

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 යළි-යොමුවීමක් සිදු කළ හැකිය.


1
මම එසේ කරන විට URL මාර්ගය තවමත් මගේ යෙදුමේ / foo සමඟ ආරම්භ වේ ...
jeffreyveon

වෙනස් ගැටළුවක් තිබිය යුතුය. මිනිත්තු කිහිපයකට පෙර මම මෙම අවස්ථාව සාර්ථකව ප්‍රතිනිෂ්පාදනය කළෙමි. මුල් URL: http: // development / foo / testme / 1234 - ප්‍රොක්සි පසුපස අන්තයට සම්බන්ධ කර ඇති Apache මත ධාවනය වන PHP ස්ක්‍රිප්ටයක REQUEST_URI: '/ testme / 1234'
ජෙන්ස් බ්‍රැඩ්ලර්

10
රීජෙක්ස් බොහෝ විට විය යුතුය /foo(.*), එසේ example.com/fooනොමැතිනම් නොගැලපේ. (බොහෝ විට ජෙෆ්රිවියන් අත්විඳ ඇත්තේ එයයි)
බෙනෝ

මේ ආකාරයේ ක්‍රියා, නමුත් මගේ ශරීරය මම ප්‍රොක්සි_සෙට්_බොඩි සමඟ සකසමින් සිටිමි.
ජස්ටින් තෝමස්

rewrite /(.*) /socket.io/ break; SOCKET.IO සඳහා මගේ දිනය සුරකින්න
user956584

150

ප්‍රොක්සි_පාස් විධානයෙහි ඔබ යූආර්අයි එකක් නියම කරන තාක් කල් නැවත ලිවීමේ රීතියක් භාවිතා නොකර සරල ස්ථාන උපසර්ග ගැලපීම මේ සඳහා ක්‍රියා කරයි:

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

විධානය /අවසානයේ ඇති අමතර දේ සැලකිල්ලට ගන්න proxy_pass. එන්ජීඑන්එක්ස් ගැලපෙන උපසර්ගය ඉවත් කර /fooඉතිරි කොටස යූආර්අයි හි බැකෙන්ඩ් සේවාදායකයට යවනු ඇත /. එම නිසා, http://myserver:80/foo/barපසුබිමට තැපැල් කරනු ලැබේ http://localhost:3200/bar.

සිට proxy_pass මත විකිපීඩියා ලේඛන :

ප්‍රොක්සි_පාස් විධානය යූආර්අයි සමඟ නිශ්චිතව දක්වා තිබේ නම්, සේවාදායකයට ඉල්ලීමක් ලබා දුන් විට, ස්ථානයට ගැලපෙන සාමාන්‍යකරණය කළ ඉල්ලීමක කොටසක් යූආර්අයි මගින් විධානයෙහි දක්වා ඇති යූආර්අයි මගින් ප්‍රතිස්ථාපනය වේ:


13
මා / ස්ථානයට / foo / added එකතු කළ ප්‍රමාණයට වඩා මට වැඩ කරයි
ඇන්ඩ්‍රි එන්

මෙය හරියටම මා සොයන දෙයයි!
anbiniyar

7
මෙය ඉතා පිරිසිදු විසඳුමකි, මෙය ප්‍රශ්නයට කැනොනිකල් පිළිතුර වීමට මම කැමැත්තෙමි.
ralien

2
පසුපස කප්පාදුව තබා ගැනීමේ හෝ ඉවත් කිරීමේ වැදගත්කම අවබෝධ කර ගැනීමට බොහෝ කාලයක් ගත විය.
පර්වේස්

7
//xyzඔබ එය කරන්නේ නම් මෙය ඇත්ත වශයෙන්ම ධාරකයට ලැබෙනු ඇත.
ආකිමිඩීස් ට්‍රජානෝ

71

නිරපේක්ෂ වඩාත් නිවැරදි ක්‍රමය සහ හොඳම පුහුණුව සාමාන්‍යයෙන් පහත පරිදි වේ:

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පසුපස කප්පාදුවක් නොමැතිව අඛණ්ඩව ක්‍රියාත්මක වන බව සහතික කරයි.


යොමු ලේඛන:


$argsනැති වී http://frontend/foo?bar=bazඇති බවක් පෙනේ : එයට සමීප වනු ඇත http://backend/.
ආග්ස්

An වනුවාන්, ඔබට ඒ ගැන විශ්වාසද? $argsඔබ ඉහත කේතය භාවිතා කරන්නේ නම්, ඒවා වෙන්ව ඇති බැවින් ඒවා නිසි ලෙස හැසිරවිය යුතු බව මට විශ්වාසයි. $uriඔබ තුළ පැහැදිලි විචල්‍යයන් භාවිතා නොකරන්නේ නම් නැවත එක්රැස් විය යුතුය proxy_pass.
cnst

@cnst ඔහ්, මට පේනවා. මම ධාරක විචල්‍යය භාවිතා කරමි. එය ප්‍රතිභානයකි.
වැනුවාන්

1
@ArchimedesTrajano, ඔබ /fooවෙත හරවා යැවීම සඳහා විශේෂ හැසිරවීමක් ඇති බැවින් ඔබ වැරදියි, එබැවින් ඔබ පසුපෙළේ /foo/අමුතු දෙයක් නොකරන්නේ නම්, /fooඉල්ලීම් පවා ඉහත කේතය සමඟ ක්‍රියා කරයි. (මෙය ඇත්ත වශයෙන්ම දැනටමත් පිළිතුරේ කොටසකි, BTW.)
cnst

4
මෙම විසඳුම මෙම සියලු සංසද වලින් ජය ගන්නා බවක් පෙනෙන්නට තිබුණද, එන්ජීඑන්එක්ස් යූආර්එල් යූආර්එල් විකේතනය කර විකේතනය කළ යූආර්එල් ප්‍රොක්සිඩ් සේවාදායකයට ලබා දෙන බව පිළිතුරෙන්ම සටහන් කළ යුතුය. එබැවින් ඔබගේ URL යූආර්එල් කේතනය කළ කොටස් රැගෙන යන්නේ නම් මෙම විසඳුම ක්‍රියාත්මක නොවේ.
කේතනය කිරීම

2

උත්සාහ කරන්න

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

හෝ

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

13
ඉහත පරිදි එය වින්‍යාසගත කළ යුත්තේ මන්දැයි ඔබ යම් පැහැදිලි කිරීමක් කළහොත් මෙම පිළිතුර හොඳ ය.
masegaloeh

//xyzඔබ එය කරන්නේ නම් මෙය ඇත්ත වශයෙන්ම ධාරකයට ලැබෙනු ඇත.
ආකිමිඩීස් ට්‍රජානෝ

1

E ටෙරාබක් කණගාටුයි තවමත් ප්‍රතිචාරයක් නොදැක්වීම ගැන.

ඔබ සත්කාරක ගොනුවක් සහිත සේවාදායකයක යෙදුම ක්‍රියාත්මක වන බව මත රඳා පවතින බැවින් ඔබ localhost භාවිතා නොකළ යුතුය. දේශීය සත්කාරක යනු 127.0.0.1 ට පෙරනිමි පරිවර්තනයක් පමණි. ඔබට මෙම ධාරක ලිපිගොනු තිබිය යුතු බව සඳහන් කිරීමට කිසිවක් නැත. එකක් තිබීම සාමාන්‍ය දෙයකි.

ලූප්බැක් අතුරුමුහුණතක් තිබීම නැවතත් රඳා පැවතිය යුතු තවත් පොදු දෙයක් වන නමුත් ඔබ තවමත් ජාලකරණ තොගයේ ඇති ලූප්බැක් අතුරුමුහුණත මත රඳා පවතී. මේ දෙක නොතිබීම දුර්ලභ අවස්ථාවකි. ඔබ කවදා හෝ මේ ගැන කරදර වන්නේ නම්. අවම වශයෙන් යුනික්ස් / ලිනක්ස් මත ඔබට සොකට් සඳහා විකල්පයක් ඇත. මෙමඟින් ජාල ගබඩාව දේශීය හොස්ට් වෙත ළඟා වීමේ අවශ්‍යතාවය ඉවත් කරනු ඇත. ධාරක මෙහෙයුම් පද්ධතියට බලපාන සාධක කිහිපයක් ඇති බැවින් මෙම ප්‍රවේශය සමඟ ප්‍රවේශම් වන්න. විවෘත ලිපිගොනු ගණන වැනි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.