HTTP ට POST යළි-යොමුවීමක් නැත්තේ ඇයි?


181

HTTP යළි-යොමුවීම් සිදු කරනු ලබන්නේ HTTP කේත 301, සහ 302 (සමහර විට වෙනත් කේත ද විය හැකිය) සහ නව ස්ථානයක ලිපිනය සහිත "පිහිටීම" ලෙස හැඳින්වෙන ශීර්ෂ ක්ෂේත්‍රයෙනි. කෙසේ වෙතත්, බ්‍රව්සර් සෑම විටම එම URL වෙත "GET" ඉල්ලීමක් යවයි.

කෙසේ වෙතත්, බොහෝ විට ඔබට ඔබගේ පරිශීලකයා POST හරහා වෙනත් වසමකට හරවා යැවිය යුතුය (උදාහරණයක් ලෙස බැංකු ගෙවීම්). මෙය පොදු සිදුවීමක් වන අතර ඇත්ත වශයෙන්ම අවශ්‍යතාවයකි. HTTP පිරිවිතරයන්හි එවැනි පොදු අවශ්‍යතාවයක් නොසලකා හැර ඇත්තේ මන්දැයි කිසිවෙකු දන්නවාද? මෙහි ප්‍රති ar ලය වනුයේ ඉලක්කගත ස්ථානයට ( ස්ථාන ශීර්ෂ ක්‍ෂේත්‍රයේ වටිනාකම) සකසා ඇති පෝරමයක් (සැඟවුණු ක්ෂේත්‍රවල පරාමිතීන් සහිතව) යැවීම සහ ආකෘති පත්‍රය ඉලක්කගත ස්ථානයට setTimeoutඉදිරිපත් කිරීම ය.


1
තත්ව කේතය 307 ඔබ සොයන දේද? මගේ පිළිතුර පහතින් බලන්න.
ඩේවිඩ් රට්කා

Answers:


192

HTTP 1.1 හි, ඇත්ත වශයෙන්ම තත්ව කේතයක් ( 307 ) ඇති අතර එයින් ඇඟවෙන්නේ එකම ක්‍රමය භාවිතා කර ඉල්ලීම නැවත නැවත කළ යුතු බවයි .

අනෙක් අය පවසා ඇති පරිදි, මෙහි අනිසි ලෙස භාවිතා කිරීමේ විභවයක් ඇත, ඒ නිසා බොහෝ රාමු ඒවායේ වියුක්ත කිරීම්වල 301 සහ 302 සමඟ බැඳී තිබේ . කෙසේ වෙතත්, නිසි අවබෝධය සහ වගකිවයුතු භාවිතය සමඟ, ඔබ සොයන දේ ඉටු කිරීමට ඔබට හැකි විය යුතුය.

අනුව බව සටහන W3.org පිරිවිතර , එම විට METHODනොවේ HEADහෝ GET, පරිශීලක නියෝජිතයන් පරිශිලක වෙත මතක් කළ යුතු නව ස්ථානයක නැවත ක්රියාත්මක ඉල්ලීම පෙර. පැරණි පරිශීලක නියෝජිතයින් 307 සමඟ කුමක් කළ යුතු දැයි නොදන්නේ නම් ඔබ පරිශීලකයාට සටහනක් සහ ආපසු හැරවීමේ යාන්ත්‍රණයක්ලබා දිය යුතුය .

මෙම පෝරමය භාවිතා කිරීම:

<form action="Test307.aspx" method="post">
    <input type="hidden" name="test" value="the test" />
    <input type="submit" value="test" />    
</form>

Test307.aspx තිබීම හුදෙක් ස්ථානය සමඟ 307 ආපසු එවන්න: http://google.com , Chrome 13 සහ Fiddler විසින් "test = the test" සැබවින්ම ගූගල් වෙත පළ කර ඇති බව සනාථ කරයි. ඇත්ත වශයෙන්ම වැඩිදුර ප්‍රතිචාරය 405 වන බැවින් ගූගල් විසින් පෝස්ටයට ඉඩ නොදේ, නමුත් එය යාන්ත්‍ර විද්‍යාව පෙන්වයි.

වැඩි විස්තර සඳහා HTTP තත්ව කේත ලැයිස්තුව සහ W3.org පිරිවිතර බලන්න .

307 තාවකාලික යළි-යොමුවීම (HTTP / 1.1 සිට) මෙම අවස්ථාවෙහිදී, ඉල්ලීම වෙනත් යූආර්අයි සමඟ නැවත නැවතත් කළ යුතුය, නමුත් අනාගත ඉල්ලීම්වලට තවමත් මුල් යූආර්අයි භාවිතා කළ හැකිය. 2 303 ඊට වෙනස්ව, මුල් ඉල්ලීම reissuing විට ඉල්ලීම ක්රමය වෙනස් කළ යුතු නැහැ. උදාහරණයක් ලෙස, වෙනත් POST ඉල්ලීමක් භාවිතා කරමින් POST ඉල්ලීමක් නැවත නැවතත් කළ යුතුය.


2
Av ඩේවිඩ් රුට්කා, වනයේ බ්‍රව්සර් සහාය කුමක්ද?
පැසීරියර්

5
Av ඩේවිඩ් රුට්කා ඔබට rfc7231 සැලකිල්ලට ගැනීම සඳහා ඔබේ පිළිතුර යාවත්කාලීන කිරීමට අවශ්‍ය විය හැකිය (යල්පැන ඇති rfc2616). පරිශීලකයා ඉල්ලා සිටීම rfc2616 හි අවශ්‍යතාවයක් මත පදනම් වේ. මෙම අවශ්‍යතාවය rfc7231 හි අතහැර දමා ඇති අතර rfc7231 මඟින් යළි-යොමුවීම් 307 ක් ඉල්ලීම් ක්‍රමය වෙනස් නොකළ යුතුය යන අවශ්‍යතාව ද හඳුන්වා දෙයි (ඔබේ පිළිතුරේ අවසානය ඔබේ උපුටා දැක්වීමේදී ඔබ සඳහන් කරයි).
nibarius

අනුව බව සටහන tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html "HTTP හරවා යැවීමේ කේත සේවා සපයන්නා සේවාදායකයාගේ සැබවින්ම user- වේ දන්නා මිස 301-306 යුතු භාවිතා කළ නොහැකි නියෝජිතයා "එබැවින් පෙනෙන පරිදි 301 වෙනුවට 308 භාවිතා කළ යුතුය. කෙසේ වෙතත් මෙය කෙටුම්පතක් පමණි.
ඇඩම්ස්

50

මෙම පිටුවෙහි මට හොඳ පැහැදිලි කිරීමක් හමු විය .

ඩබ්ලිව්ඩබ්ලිව්ඩබ්ලිව් හි ඇති සරලම තත්වයන් වන්නේ “අවිනිශ්චිත” ගනුදෙනු, එනම් කිසිදු හානියක් නොකර නැවත නැවත කළ හැකි ඒවා ය. මේවා සාමාන්‍යයෙන් "GET" ගනුදෙනු වේ, ඒවා සරල URL යොමු කිරීම් (උදා: href = හෝ HTML හි ඇති src = ගුණාංග) නිසා හෝ GET ක්‍රමය භාවිතා කරමින් ආකෘති ඉදිරිපත් කිරීම් නිසා ය. එවැනි ගනුදෙනුවක් නැවත හරවා යැවීම සරල වන අතර කිසිදු ප්‍රශ්නයක් අසනු නොලැබේ: නව URL ය නියම කරන ස්ථානය: ශීර්ෂකය ඇතුළුව සේවාදායකයාට යළි හරවා යැවීමේ ප්‍රතිචාරය ලැබෙන අතර සේවාදායකයා එයට ප්‍රතිචාර දක්වන්නේ නව URL වෙත ගනුදෙනුව නැවත නිකුත් කිරීමෙනි. මෙම යළි-යොමුවීම් සමඟ සම්බන්ධිත විවිධ 30x තත්ව කේත අතර වෙනසක් ඒවායේ ව්‍යංගාර්ථය තුළ තිබේ, නමුත් වෙනත් ආකාරයකින් ඒවා GET ඉල්ලීම් වලට ප්‍රතිචාර වශයෙන් මූලික වශයෙන් සමාන වේ (301 සහ 302).

POST ගනුදෙනු වෙනස් වේ, මන්ද ඒවා ප්‍රතිපත්තිමය වශයෙන් පරමාදර්ශී නොවන (පීසා ඇණවුම් කිරීම, ඡන්දය ප්‍රකාශ කිරීම හෝ වෙනත් දෙයක් වැනි) ලෙස අර්ථ දක්වා ඇති අතර අත්තනෝමතික ලෙස නැවත නොකළ යුතුය.

HTTP ප්‍රොටොකෝලය පිරිවිතරයන් මෙම වෙනස සැලකිල්ලට ගැනීම සඳහා නිර්මාණය කර ඇත: GET ක්‍රමය නිර්වචනය කර ඇත්තේ සහජයෙන්ම අවිනිශ්චිත බව ලෙස වන අතර, POST ක්‍රමය අර්ථ දක්වා ඇත්තේ අවම වශයෙන් විභවයක් නැති, අනන්‍යතාවයෙන් තොර; නොදැනුවත්වම පරිශීලකයින් ආරක්ෂා කිරීම සඳහා (නැවත) ඔවුන් අපේක්ෂා නොකළ POST ගනුදෙනුවක් ඉදිරිපත් කිරීම හෝ ඔවුන්ට අවශ්‍ය නොවන සන්දර්භයකට POST ඉදිරිපත් කිරීම සඳහා සේවාදායක නියෝජිතයින් (බ්‍රව්සර් වැනි) විසින් ගත යුතු පූර්වාරක්ෂාවන් ගණනාවක් පිරිවිතරයන්ගෙන් ඉල්ලා සිටී. .

පරිශීලකයින්ට අනවශ්‍ය අවදානමක් ඇතිවීම හෝ ඔවුන්ගේ යෙදුම් වලට අනවශ්‍ය හානියක් කිරීම වැළැක්වීම සඳහා තාක්‍ෂණිකව සීමා කිරීමේ රසිකයෙක් නොවුවද, මට කාරණය තේරුම් ගත හැකි අතර එය අර්ථවත් කරයි.


බොහෝ තර්ක විතර්ක වන්නේ අන්තර් සම්බන්ධතා මන්දගාමී හා විශ්වාස කළ නොහැකි වූ දින දක්වා ය (ඒවා තවමත් ලෝකයේ බොහෝ ස්ථානවල පවතී). මට පැහැදිලිවම මතකයි මම ඩයල් අප් භාවිතා කළ විට සහ වෙනත් අයෙකු දුරකථනය ගත් විට අහඹු ලෙස විසන්ධි වනු ඇත. දේවල් නැවත ඉදිරිපත් කර එකම ක්‍රියාව සිදු කිරීමේ අවදානම දෙවරක් ක්‍රියාත්මක කිරීමට වඩා පිටුව නැවත පූරණය කර සේවාදායකයේ තත්වය කුමක්දැයි බැලීම වඩා හොඳය.
zzzzBov

Al ෆැල්කන්, “ආගන්තුක කවුන්ටරය” වැඩි කිරීම අනර්ථකාරී නොවන අය ලෙස සලකනු ඇත්ද? එසේ නම්, මේ දිනවල කිසිදු වෙබ් අඩවියක් පාහේ අව්‍යාජ GETs නොකරයි ...
පැසීරියර්

Ac පැසීරියර්: සාමාන්‍යයෙන් අයිඩම්පොටෙන්ට් යනු “අර්ථවත් ආකාරයකින් අයිඩම්පොටෙන්ට්” ලෙස අර්ථ දැක්වේ, නිදසුනක් වශයෙන්, එකම අයිතමය දෙවරක් මිලට ගැනීම මිස සංචාර දෙකක් නැරඹීම නොවේ. එසේ නොමැතිනම්, ඔබ හරි ය. නමුත් ඇත්ත වශයෙන්ම, පිරිවිතරයන්ට අවශ්‍ය අවස්ථාවන්හිදී අර්ථවත් ලෙස අවිනිශ්චිත විය යුතුය, එනම් අනුපිටපත් වැළැක්වීම සඳහා පිටුවේ හැඳුනුම්පතක් ඇතුළත් කිරීම වැනි - බ්‍රව්සරයට පරිශීලකයාගෙන් කිසිදු නිරවද්‍යතාවයකින් පිළිතුරු දීමට ක්‍රමයක් නොමැති ප්‍රශ්නයක් ඇසීමට අවශ්‍ය නොවේ. කෙසේ වෙතත්, POST යළි හරවා යැවීම වැළැක්වීම අනන්‍යතාවයට බල නොපායි; එය හුදෙක් පණිවිඩයේ ඉල්ලීමෙහි ඉලක්කය සැබවින්ම අවසන් බව පවසන පණිවිඩයකි.
ලෝරන්ස් ඩොල්

මෙම තර්කයට මෙය අර්ථවත් වන්නේ කෙසේදැයි මම නොදනිමි. මම චේස් බැංකු වෙබ් අඩවියේ සිටින බව පවසමින් මම පෝරමයක් ඉදිරිපත් කරමි. මම දැනටමත් ඔවුන්ව එකඟ / විශ්වාස කර ඇත්තෙමි. එබැවින් ඔවුන්ට එම දත්ත වෙනත් පිටුවකට හරවා යැවීමට සිදුවුවහොත්, මට නැවත එකඟ වීමට සිදුවන්නේ ඇයි? නැතහොත් තවත් උදාහරණයක්, මම පෙරනිමියෙන් ජාවාස්ක්‍රිප්ට් අක්‍රිය කළ පුද්ගලයෙක් යැයි පවසන්න. දිනක් මම අන්තර්ජාලය හරහා උකස් යෙදුමක් පුරවා, පෝරමය ඉදිරිපත් කළ විට එහි දෝෂ තිබේ. දත්ත පූර්ව ජනගහනය කිරීම සඳහා මා විසින් පුරවා ඇති පිටුවට (POST සමඟ) යෙදුම හරවා යැවිය හැකි නම් එය ඉතා හොඳ වේ.
b01

La ෆ්ලැකන්, POST සමඟ යළි-යොමුවීමක් සීමා කිරීමෙන් ඕනෑම ආකාරයකින් අනතුර වළක්වා ගත හැකි බවට මට සාක්ෂි අවශ්‍යයි. මට මුලින්ම මගේ දත්ත සමඟ යෙදුම විශ්වාස කළ යුතු බැවින්, දත්ත ඇති පසු ඔවුන්ට අවශ්‍ය ඕනෑම දෙයක් ඔවුන් සමඟ කළ හැකිය. POST සමඟ ඉල්ලීමට වඩා යළි-යොමුවීම් අවදානමට ලක්විය හැකි යැයි මම නොසිතමි.
b01

2

HET පිරිවිතරයේ ( RFC 2616 ) GET (සහ තවත් ක්‍රම කිහිපයක්) 'SAFE' ලෙස අර්ථ දක්වා ඇත :

9.1.1 ආරක්ෂිත ක්‍රම

මෘදුකාංගය අන්තර්ජාලය හරහා ඔවුන්ගේ අන්තර්ක්‍රියා වලදී පරිශීලකයා නියෝජනය කරන බව ක්‍රියාත්මක කරන්නන් දැන සිටිය යුතු අතර, තමන්ට හෝ වෙනත් අයට අනපේක්ෂිත වැදගත්කමක් ඇති විය හැකි ඕනෑම ක්‍රියාමාර්ගයක් පිළිබඳව පරිශීලකයා දැනුවත් වීමට ඉඩ දිය යුතුය.

GET සහ HEAD ක්‍රමවේදයන් නැවත ලබා ගැනීම හැර වෙනත් ක්‍රියාමාර්ගයක වැදගත්කම නොතිබිය යුතු බව සම්මුතියෙන් තහවුරු වී ඇත. මෙම ක්‍රම “ආරක්ෂිත” ලෙස සැලකිය යුතුය. මෙය පරිශීලක නියෝජිතයින්ට POST, PUT සහ DELETE වැනි වෙනත් ක්‍රම විශේෂ ආකාරයකින් නිරූපණය කිරීමට ඉඩ සලසයි, එවිට අනාරක්ෂිත ක්‍රියාවක් ඉල්ලා සිටින බව පරිශීලකයා දැනුවත් කරයි.

ස්වාභාවිකවම, GET ඉල්ලීමක් ඉටු කිරීමේ ප්‍රති the ලයක් ලෙස සේවාදායකය අතුරු ආබාධ ඇති නොකරන බවට සහතික විය නොහැක; ඇත්ත වශයෙන්ම, සමහර ගතික සම්පත් එය අංගයක් ලෙස සලකයි. මෙහි ඇති වැදගත් වෙනස නම් පරිශීලකයා අතුරු ආබාධ ඉල්ලා නොසිටීමයි, එබැවින් ඒවාට වග කිව නොහැක.

මෙයින් අදහස් කරන්නේ GET ඉල්ලීමක් පරිශීලකයාට දැකීමට අකමැති දෙයක් දැකීමෙන් ඔබ්බට කිසි විටෙකත් බරපතල ප්‍රතිවිපාක ඇති නොවිය යුතු බවයි, නමුත් POST ඉල්ලීමක් මඟින් ඔවුන්ට හෝ වෙනත් පුද්ගලයින්ට වැදගත් වන සම්පතක් වෙනස් කළ හැකිය.

ජාවාස්ක්‍රිප්ට් සමඟ මෙය වෙනස් වී ඇතත්, සාම්ප්‍රදායිකව විවිධ පරිශීලක අතුරුමුහුණත් තිබුණි - පරිශීලකයන්ට සබැඳි ක්ලික් කිරීමෙන් GET ඉල්ලීම් අවුලුවාලිය හැකි නමුත් POST ඉල්ලීමක් අවුලුවාලීමට පෝරමයක් පුරවා ගත යුතුය. මම හිතන්නේ HTTP හි නිර්මාණකරුවන් ආරක්ෂිත සහ ආරක්ෂිත නොවන ක්‍රම අතර වෙනස පවත්වා ගැනීමට උනන්දු විය.

POST වෙත හරවා යැවීම කිසි විටෙකත් අවශ්‍ය විය යුතු යැයි මම නොසිතමි. සිදු කළ යුතු ඕනෑම ක්‍රියාවක් සේවාදායක පැත්තේ කේතය තුළ ශ්‍රිතයක් ඇමතීමෙන් කළ හැකිය, නැතහොත් එය වෙනත් සේවාදායකයක සිදුවීමට අවශ්‍ය නම් බ්‍රව්සරය සඳහා URL එකක් සහිත යළි-යොමුවීමක් POST වෙත සේවාදායකයට යැවීම වෙනුවට. පරිශීලකයා සඳහා ප්‍රොක්සියක් ලෙස ක්‍රියා කරමින් එම සේවාදායකයටම ඉල්ලීමක් කළ හැකිය.

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.