අපාචේ හි හරවා යැවීම, URL වෙනස් කිරීම හෝ HTTP HTTPS වෙත හරවා යැවීම - Mod_Rewrite රීති ගැන ඔබ දැන ගැනීමට අවශ්‍ය සෑම දෙයක්ම නමුත් විමසීමට බිය විය


268

මෙය Apache හි mod_rewrite පිළිබඳ කැනොනිකල් ප්‍රශ්නයකි .

ඉල්ලීම් URL එකක් වෙනස් කිරීම හෝ පරිශීලකයින් මුලින් ඉල්ලා සිටි URL ට වඩා වෙනස් URL වෙත හරවා යැවීම mod_rewrite භාවිතා කරයි. මෙයට පහත දෑ ඇතුළත් වේ:

  • HTTP HTTPS වෙත වෙනස් කිරීම (හෝ වෙනත් ආකාරයකින්)
  • නව ප්‍රතිස්ථාපනයකට තවදුරටත් නොපවතින පිටුවකට ඉල්ලීමක් වෙනස් කිරීම.
  • URL ආකෘතියක් වෙනස් කිරීම (? Id = 3433 සිට / id / 3433 වැනි)
  • සඳ සහ සූර්යයා යටතේ කළ හැකි ඕනෑම දෙයක් මත පදනම්ව, යොමුකරු මත පදනම්ව, බ්‍රව්සරය මත පදනම්ව වෙනත් පිටුවක් ඉදිරිපත් කිරීම.
  • ඔබට URL සමඟ අවුල් කිරීමට අවශ්‍ය ඕනෑම දෙයක්

Mod_Rewrite රීති ගැන ඔබ මෙතෙක් දැන ගැනීමට කැමති සෑම දෙයක්ම විමසීමට බිය විය!

Mod_rewrite නීති ලිවීමේ විශේෂ expert යෙකු වන්නේ කෙසේද?

  • Mod_rewrite නීති වල මූලික ආකෘතිය සහ ව්‍යුහය කුමක්ද?
  • නිත්‍ය ප්‍රකාශනවල ස්ථිර ග්‍රහණයක් ලබා ගැනීමට මට අවශ්‍ය වන්නේ කුමන ස්වරූපය / රසයද?
  • නැවත ලිවීමේ නීති ලිවීමේදී වඩාත් පොදු වැරදි / අන්තරායන් මොනවාද?
  • Mod_rewrite නීති පරීක්ෂා කිරීම සහ සත්‍යාපනය කිරීම සඳහා හොඳ ක්‍රමයක් කුමක්ද?
  • මා දැනුවත් විය යුතු mod_rewrite නීති වල SEO හෝ කාර්ය සාධන ඇඟවුම් තිබේද?
  • Mod_rewrite කාර්යය සඳහා සුදුසු මෙවලමක් ලෙස පෙනෙන නමුත් එසේ නොවන පොදු අවස්ථා තිබේද?
  • පොදු උදාහරණ මොනවාද?

ඔබේ නීති පරීක්ෂා කිරීමට ස්ථානයක්

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


9
මෙම ප්‍රශ්නය පිටුපස ඇති අදහස නම් අපගේ නිත්‍ය පරිශීලකයින් පිස්සු වට්ටන නිමක් නැති mod_rewrite ප්‍රශ්න සඳහා සමීප මාවතක් ලබා දීමයි. මෙය serverfault.com/questions/49765/how-does-subnetting-work හි උප ජාලකරණය සමඟ කළ දෙයට බෙහෙවින් සමාන ය .
කයිල් බ්‍රැන්ඩ්

1
එසේම, මට මෙම ප්‍රශ්නයට වැඩි කැමැත්තක් අවශ්‍ය නැත , ඒ වෙනුවට ඔවුන් පිළිතුර වෙත යා යුතුය. මට මෙය සීඩබ්ලිව් කිරීමට අවශ්‍ය නැත, මන්ද මම බලාපොරොත්තු වන දෙය සඳහා පෝස්ටරයට සම්පූර්ණ ගෞරවය හිමිවන බවට සහතික කර ගැනීමට අවශ්‍ය නිසා සියලු මොඩ්_රයිට් ප්‍රශ්න අවසන් කිරීමට මෝඩ්_රූරයිට් පිළිතුර වේ .
කයිල් බ්‍රැන්ඩ්

4
කණගාටුයි, මම ප්‍රශ්නය ඉහළට ඔසවා තැබුවෙමි. ;-) mod-rewriteටැග් සෙවුම් / පෙරහන් වල ඉහළින්ම (හෝ ආසන්නයේ) එය පෙන්විය යුතු යැයි මම සිතමි .
ස්ටීවන් සඳුදා

වෙනත් අයෙකු (ටීඑම්) පොදු භාවිත අවස්ථා හැසිරවිය යුතුය. එය සාධාරණය ඉටු කිරීමට තරම් මම ඔවුන්ව හොඳින් නොදනිමි.
sysadmin1138

මාර්ගය වඩාත් කෙටි කිරීම සඳහා සමහර විට මෙම ප්‍රශ්නය මෝඩ්-රිවිරයිට් ටැග් විකියට සම්බන්ධ කළ යුතුය.
beldaz

Answers:


228

mod_rewrite සින්ටැක්ස් අනුපිළිවෙල

mod_rewrite සැකසීමට බලපාන නිශ්චිත ඇණවුම් නීති ඇත. ඕනෑම දෙයක් සිදු කිරීමට පෙර, RewriteEngine Onමෙය mod_rewrite සැකසුම් සක්‍රීය කරන බැවින් විධානය ලබා දිය යුතුය. මෙය වෙනත් නැවත ලිවීමේ නියෝගයන්ට පෙර විය යුතුය.

RewriteCondපූර්වයෙන් RewriteRuleඑම එක් රීතියක් කොන්දේසිවලට යටත් වේ. පහත දැක්වෙන ඕනෑම නැවත ලිවීමේ රීති කොන්දේසි වලට යටත් නොවූ ලෙස සකසනු ලැබේ.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

මෙම සරල අවස්ථාවෙහිදී, HTTP යොමු කිරීම serverfault.com වෙතින් නම්, බ්ලොග් ඉල්ලීම් විශේෂ සේවාදායක පිටු වෙත හරවා යවන්න (අපි එය විශේෂයි). කෙසේ වෙතත්, ඉහත බ්ලොක් එකට අමතර නැවත ලිවීමේ රේඛාවක් තිබේ නම්:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

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

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

නමුත් බොහෝ විට සිදු කළ යුත්තේ උපක්‍රමශීලී ආදේශන සින්ටැක්ස් ය.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

වඩාත් සංකීර්ණ RewriteRule සැකසීම සඳහා කොන්දේසි අඩංගු වේ. අන්තිම (html|jpg)වර්‍ගාත්මක , RewriteRule ට කියන්නේ එකකට htmlහෝ ගැලපෙන ලෙසටය jpg, සහ නැවත ලිවූ නූලෙහි ගැලපෙන නූල් $ 2 ලෙස නිරූපණය කරන්න. මෙය පෙර බ්ලොක් එකට තාර්කිකව සමාන වන අතර RewriteCond / RewriteRule යුගල දෙකක් ඇත, එය එය හතරක් වෙනුවට පේළි දෙකකින් කරයි.

බහුවිධ නැවත ලිවීමේ රේඛා ව්‍යංගයෙන් ANDed කර ඇති අතර ඒවා පැහැදිලිවම ORed කළ හැකිය. සර්වර්ෆෝල්ට් සහ සුපර් පරිශීලක (පැහැදිලි හෝ) යන දෙකින්ම යොමු කරන්නන් හැසිරවීමට:

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

ක්‍රෝම් බ්‍රව්සර් සමඟ සර්වර්ෆෝල්ට් යොමු කළ පිටු සේවය කිරීම සඳහා (ව්‍යංගයෙන් සහ):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBaseපහත දැක්වෙන RewriteRuleවිධානයන් ඒවායේ සැකසුම් හැසිරවිය යුතු ආකාරය නියම කරන බැවින් ඇණවුම විශේෂිත වේ. .Htaccess ගොනු වල එය ඉතා ප්‍රයෝජනවත් වේ. භාවිතා කරන්නේ නම්, එය .htaccess ගොනුවක "RewriteEngine on" යටතේ ඇති පළමු නියෝගය විය යුතුය. මෙම උදාහරණය ගන්න:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

මෙය mod_rewrite ට කියනුයේ එය දැනට හසුරුවන මෙම විශේෂිත URL ය පැමිණියේ භෞතික නාමාවලි මාර්ගය (/ home / $ පරිශීලක නාමය / public_html / blog) වෙනුවට http://example.com/blog/ හරහා වන අතර ඒ අනුව ප්‍රතිකාර කිරීම. මේ හේතුව නිසා, RewriteRuleඑය URL හි "/ බ්ලොග්" වලින් පසුව ආරම්භ වන බව සලකයි. මෙන්න එකම දෙය වෙනස් ආකාර දෙකකින් ලියා ඇත. එකක් RewriteBase සමඟ, අනෙක නොමැතිව:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

ඔබට පෙනෙන පරිදි, වෙබ් සේවාදායකයට වඩා RewriteBaseවෙබ් අඩවි මාර්ගය අන්තර්ගතයට යොමු කිරීමට රීති නැවත ලිවීමට ඉඩ සලසයි , එමඟින් එවැනි ලිපිගොනු සංස්කරණය කරන අයට ඒවා වඩාත් බුද්ධිමත් කළ හැකිය. එසේම, සෞන්දර්යාත්මක ආකර්ෂණයක් ඇති විධානයන් කෙටි කළ හැකිය.


RewriteRule ගැලපෙන සින්ටැක්ස්

RewriteRule හි නූල් ගැලපීම සඳහා සංකීර්ණ වාක්‍ය ඛණ්ඩයක් ඇත. මම කොඩි ([PT] වැනි) වෙනත් කොටසක ආවරණය කරමි. මිනිස් පිටුවක් කියවීමට වඩා බොහෝ විට සිසැඩ්මින්වරු ආදර්ශයෙන් ඉගෙන ගන්නා නිසා මම උදාහරණ ලබා දී ඔවුන් කරන දේ පැහැදිලි කරමි.

RewriteRule ^/blog/(.*)$    /newblog/$1

මෙම .*ඉදිකිරීමක් ඕනෑම තනි චරිතය (තරග .) ශුන්ය හෝ ඊට වැඩි වතාවක් ( *). වරහන් තුළ එය ඇතුළත් කිරීමෙන් එය $ 1 විචල්‍යය ලෙස ගැලපෙන නූල් සැපයීමට පවසයි.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

මෙම අවස්ථාවෙහිදී, පළමුවැන්න * පේරන් වල කොටා නොතිබූ බැවින් නැවත ලියන ලද නූලට ලබා නොදේ. මෙම රීතිය නව බ්ලොග් අඩවියේ නාමාවලි මට්ටමක් ඉවත් කරයි. (/blog/2009/sample.html /newblog/sample.html බවට පත්වේ).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

මෙම අවස්ථාවේ දී, පළමු වරහන් ප්‍රකාශනය ගැලපෙන කණ්ඩායමක් සකසයි. මෙය $ 1 බවට පත්වන අතර එය අවශ්‍ය නොවන අතර නැවත ලියන ලද නූලෙහි භාවිතා නොවේ.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

මෙම අවස්ථාවේ දී, අපි නැවත ලියන ලද නූලෙහි $ 1 භාවිතා කරමු.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

මෙම රීතිය අක්ෂර පරාසයක් නියම කරන විශේෂ වරහන් සින්ටැක්ස් භාවිතා කරයි . [0-9] 0 සිට 9 දක්වා ඉලක්කම් වලට ගැලපේ. මෙම නිශ්චිත රීතිය 2000 සිට 2099 දක්වා කාලය පාලනය කරයි.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

මෙය පෙර රීතියට සමාන දෙයක් කරයි, නමුත් {2} කොටස එය පෙර අක්ෂරයට (මෙම අවස්ථාවේ වරහන් ප්‍රකාශනය) දෙවරක් ගැලපෙන ලෙස පවසයි.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

මෙම නඩුව දෙවන ගැලපෙන ප්‍රකාශනයේ ඕනෑම කුඩා අකුරකට අනුරූප වන අතර හැකි තරම් අක්ෂර සඳහා එසේ කරන්න. මෙම \.ඉදිකිරීමක් නොවන සැබෑ කාලය, එය පෙර උදාහරණ වේ විශේෂ චරිතයක් ලෙස කාලය සඳහා ප්රතිකාර කිරීමට පවසනවා. ගොනුවේ නමෙහි ඉරක් තිබේ නම් එය බිඳී යනු ඇත.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

මෙමඟින් ගොනු නාමයන් ඉර සහිත ඉරක් සමඟ කොටු වේ. කෙසේ වෙතත්, -වරහන් ප්‍රකාශනවල විශේෂ චරිතයක් මෙන්, එය ප්‍රකාශනයේ පළමු චරිතය විය යුතුය.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

මෙම අනුවාදය ඕනෑම ගොනු නාමයක් අකුරු, අංක හෝ ලිපිගොනු නාමයෙන් උගුලට හසු -කරයි. වරහන් ප්‍රකාශනයක ඔබ බහු අක්ෂර කට්ටල නියම කරන්නේ මේ ආකාරයට ය.


ධජ නැවත ලියන්න

නැවත ලිවීමේ නීති වල ධජ වලට විශේෂ අර්ථයන් සහ භාවිත කේත රාශියක් ඇත.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

ධජය යනු [L]ඉහත ප්‍රකාශනයේ අවසානයේ ය. කොමා මඟින් වෙන් කරන ලද බහු ධජ භාවිතා කළ හැකිය. සම්බන්ධිත ලියකියවිලි එක් එක් විස්තර කරයි, නමුත් මෙන්න ඒවා කෙසේ හෝ වේ:

එල් = අන්තිම. මෙය ගැලපෙන විට නැවත ලිවීමේ රීති සැකසීම නවත්වන්න. ඇණවුම් ගණන්!
සී = දාමය. ඊළඟ RewriteRule සැකසීම දිගටම කරගෙන යන්න. මෙම රීතිය නොගැලපේ නම්, ඊළඟ රීතිය ක්‍රියාත්මක නොවේ. මේ පිළිබඳ වැඩි විස්තර පසුව.
= පාරිසරික විචල්‍යය සකසන්න. අපාචේ වෙබ් සේවාදායක හැසිරීමට බලපාන විවිධ පාරිසරික විචල්‍යයන් ඇත.
F = තහනම්. මෙම රීතිය ගැලපෙන්නේ නම් 403-තහනම් දෝෂයක් ලබා දෙයි.
ජී = ගියා. මෙම රීතිය ගැලපෙන්නේ නම් 410-ගොස් දෝෂයක් ලබා දෙයි.
එච් = හසුරුවන්නා. ඉල්ලීම නිශ්චිත MIME වර්ගයේ ආකාරයට හැසිරවීමට බල කරයි.
N = ඊළඟට. රීතිය නැවත ආරම්භ කර නැවත ගැලපීමට බල කරයි. පරෙස්සම් වෙන්න! ලූප ප්‍රති result ල විය හැකිය.
NC = නඩුවක් නැත. ඉඩ දෙයිjpgjpg සහ JPG යන දෙකම ගැලපීමට.
NE = ගැලවීමක් නැත. විශේෂ අක්ෂර (.? # & Etc) ඒවායේ හෙක්ස් කේතයට සමාන ලෙස නැවත ලිවීම වළක්වයි.
NS = උපසිරැසි නොමැත. ඔබ සේවාදායක පාර්ශවීය ඇතුළත් කිරීම් භාවිතා කරන්නේ නම්, මෙය ඇතුළත් කළ ලිපිගොනු සමඟ ගැලපීම වළක්වනු ඇත.
පී = ප්‍රොක්සි. මොඩ්_ප්‍රොක්සි විසින් රීතිය හැසිරවීමට බල කරයි. විනිවිද පෙනෙන ලෙස වෙනත් සේවාදායකයන්ගෙන් අන්තර්ගතය සපයන්න, මන්ද ඔබේ වෙබ් සේවාදායකයා එය ලබාගෙන එය නැවත සේවය කරයි. මෙය භයානක ධජයකි, මන්ද දුර්වල ලෙස ලියා ඇති එකක් ඔබගේ වෙබ් සේවාදායකය විවෘත ප්‍රොක්සියක් බවට පත් කරන අතර එය නරක ය.
PT = පසුකර යන්න. RewriteRule ගැළපුමේ අන්වර්ථ ප්‍රකාශයන් සැලකිල්ලට ගන්න.
QSA = QSAppend. මුල් නූලට විමසුමක් ඇති විට ( http://example.com/thing?asp=foo) මුල් විමසුම් දාමය නැවත ලියන ලද නූලට එකතු කරන්න. සාමාන්යයෙන් එය ඉවතලනු ඇත. ගතික අන්තර්ගත සඳහා වැදගත් වේ.
R = යළි-යොමුවීම. නිශ්චිත URL වෙත HTTP යළි-යොමුවීමක් සපයන්න. නිශ්චිත යළි-යොමුවීම් කේතයක් ද ලබා දිය හැකිය [R = 303]. ඉතා සමාන RedirectMatchවන අතර එය වේගවත් වන අතර හැකි සෑම විටම භාවිතා කළ යුතුය.
එස් = මඟ හරින්න. මෙම රීතිය මඟ හරින්න.
ටී = වර්ගය. ආපසු ලබා දුන් අන්තර්ගතයේ මයිම වර්ගය සඳහන් කරන්න. AddTypeනියෝගයට බෙහෙවින් සමාන ය .

RewriteCondඑක් රීතියකට පමණක් අදාළ වන බව මා කී ආකාරය ඔබ දන්නවාද ? හොඳයි, දම්වැලෙන් ඔබට එය වටා යා හැකිය.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

පළමු RewriteRule හි දම්වැල් ධජය ඇති හෙයින්, දෙවන නැවත ලිවීමේ නියමය ක්‍රියාත්මක වන්නේ පළමු වරට සිදු වන විටය, එනම් පෙර RewriteCond රීතිය ගැලපෙන විටය. අපාචේ නිත්‍ය ප්‍රකාශන ඔබේ මොළයට හානියක් කරයි නම් හැන්ඩි. කෙසේ වෙතත්, පළමු කොටසේ මා පෙන්වා දෙන සර්ව පාක්ෂික ක්‍රමය ප්‍රශස්තිකරණ දෘෂ්ටි කෝණයකින් වේගවත් වේ.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

කොඩි හරහා මෙය සරල කළ හැකිය:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

එසේම, සමහර කොඩි RewriteCond සඳහාද අදාළ වේ. NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

"ServerFault.com" සමඟ ගැලපේ


9
හොඳට කලා. [පිරවුම]
ඊඊඒඒ

3
ඉතා ලස්සන mod_rewriteහා රීජෙක්ස් ප්‍රයිමර්. +1.
ස්ටීවන් සඳුදා

3
එය බව දැන ගැනීමට ඇතැම් විට ප්රයෝජනවත් RewriteCondඇත්තටම සැකසෙන පසු එම RewriteRuleසම්පාත වේ. "රිවිරයිට් රූල්ඩ් වලට පෙර රිවර්ට්කොන්ඩ් එම රීතිය කොන්දේසි සහිතව යටත් කරයි" යනුවෙන් ඔබ පවසන ස්ථානයට ආසන්නයේ "පසුව වැඩි විස්තර" කියන්නට ඔබට අවශ්‍ය විය හැකිය. රීජෙක්ස් යනු පර්ල්-අනුකූල නිත්‍ය ප්‍රකාශන බව සඳහන් කිරීමට ඔබට අවශ්‍ය විය හැකිය. තවද ඔබට "... RewriteRule එය නූල් ආරම්භය ලෙස සලකයි ..." හි බාහිර අක්ෂර වින්‍යාසයක් ඇත
වැඩිදුර දැනුම් දෙන තුරු

2
RewriteRule ^/blog/.*/(.*)$ /newblog/$1මෙම නොගැලපේ පළමු බහලුම අංගයක් - rewriterules පෙරනිමියෙන් කෑදර වේ. /.*/(.*) / 1 / (2) / සහ / 1/2/3/4/5 / (6) / යන දෙකටම ගැලපේ, එබැවින් ඔබට පළමු මාර්ගයට පමණක් ගැලපීමට / [^ /] * / අවශ්‍ය වේ. සංරචකය.
අනුවර්

1
ys sysadmin1138, මෙම පිළිතුර හොඳ යැයි මම සිතමි, නමුත් ඊ, එන්, එන්එස්, පී, පීටී සහ එස් යන ධජයන් උදාහරණ සමඟ විස්තාරණය කළහොත් වඩා හොඳ විය හැකිය, මන්ද එම කොඩි ක්‍රියා කරන ආකාරය පැහැදිලි නැති නිසා ය
පැසීරියර්

39

Mod_rewrite නීති වල මූලික ආකෘතිය සහ ව්‍යුහය කුමක්ද?

මෙම කරුණු පිළිබඳ sysadmin1138 ගේ විශිෂ්ට පිළිතුරට මම කල් තබමි.

නිත්‍ය ප්‍රකාශනවල ස්ථිර ග්‍රහණයක් ලබා ගැනීමට මට අවශ්‍ය වන්නේ කුමන ස්වරූපය / රසයද?

Sysadmin1138 විසින් දක්වා ඇති සින්ටැක්ස් අනුපිළිවෙල, සින්ටැක්ස් ගැලපීම / නිත්‍ය ප්‍රකාශන සහ රිවිරයිට් රූල් ධජ වලට අමතරව, මොඩ්_රූරයිට් විසින් HTTP ඉල්ලීම් ශීර්ෂයන් සහ අපාචේගේ වින්‍යාසය මත පදනම්ව Apache පරිසර විචල්‍යයන් නිරාවරණය කරන බව සඳහන් කර ඇති බව මම විශ්වාස කරමි.

Mod_rewrite සඳහා ලබා ගත හැකි විචල්‍යයන් පිළිබඳ සවිස්තරාත්මක ලැයිස්තුවක් සඳහා AskApache හි mod_rewrite Debug Tutorial නිර්දේශ කරමි .

නැවත ලිවීමේ නීති ලිවීමේදී වඩාත් පොදු වැරදි / අන්තරායන් මොනවාද?

PCRE වාක්‍ය ඛණ්ඩය පිළිබඳ වැරදි වැටහීමක් / විශේෂ අක්ෂර නිසි ලෙස ගැලවීමට අපොහොසත් වීම හෝ ගැලපීම සඳහා භාවිතා කරන විචල්‍ය (ය) වල අන්තර්ගතය පිළිබඳ අවබෝධයක් නොමැතිකම හේතුවෙන් RewriteRule හි කඳේ ඇති බොහෝ ගැටලු.

සාමාන්‍ය ගැටළු සහ නිර්දේශිත දෝශ නිරාකරණ:

  • 500 - අභ්‍යන්තර සේවාදායක දෝෂය - වින්‍යාස ගොනුව (ය) තුළ වින්ඩෝස් කරත්ත පාලක ඉවත් කරන්න , mod_rewrite සක්‍රීය කර ඇති බවට වග බලා ගන්න ( IfModuleමෙම තත්වය මඟහරවා ගැනීම සඳහා කොන්දේසි සහිතව ඔතා තබන්න ), විධානය සින්ටැක්ස් පරික්ෂා කරන්න, ගැටළුව හඳුනා ගන්නා තෙක් උපදෙස් ප්‍රකාශ කරන්න
  • යළි- යොමුවීමේ ලූපය - RewriteLog සහ RewriteLogLevel භාවිතා කරන්න, ගැටලුව හඳුනා ගන්නා තෙක් විධානයන් ප්‍රකාශ කරන්න

Mod_rewrite නීති පරීක්ෂා කිරීම සහ සත්‍යාපනය කිරීම සඳහා හොඳ ක්‍රමයක් කුමක්ද?

පළමුව, ඔබ ගැලපීමට අදහස් කරන පරිසර විචල්‍ය (ය) වල අන්තර්ගතය දෙස බලන්න - ඔබ PHP ස්ථාපනය කර ඇත්නම්, මෙය ඔබගේ යෙදුමට පහත දැක්වෙන කොටස එකතු කිරීම තරම් සරල ය:

<?php
  var_dump($_SERVER);
?>

... ඉන්පසු ඔබේ නීති ලියන්න (වඩාත් සුදුසු වන්නේ සංවර්ධන සේවාදායකයක පරීක්ෂා කිරීම සඳහා) සහ ඔබේ Apache ErrorLog ගොනුවේ නොගැලපෙන ගැලපීමක් හෝ ක්‍රියාකාරකමක් සටහන් කරන්න .

වඩාත් සංකීර්ණ නීති සඳහා, RewriteLogගොනුවකට ක්‍රියාකාරකම් සැකසීමට සහ සැකසීමට mod_rewrite හි නියෝගය භාවිතා කරන්නRewriteLogLevel 3

මා දැනුවත් විය යුතු mod_rewrite නීති වල SEO හෝ කාර්ය සාධන ඇඟවුම් තිබේද?

AllowOverride allඅපාචේ ලෙස සේවාදායකයේ ක්‍රියාකාරිත්වයට බලපෑම් .htaccessකිරීම සෑම ඉල්ලීමක් සමඟම ලිපිගොනු සහ විග්‍රහයන් විග්‍රහ කළ යුතුය - හැකි නම්, ඔබේ වෙබ් අඩවිය සඳහා අථත්ය හෝස්ට් වින්‍යාසය තුළ සියලු විධානයන් තබා ගන්න හෝ .htaccessඒවා අවශ්ය නාමාවලි සඳහා පමණක් අභිබවා යා හැකිය.

ගූගල් හි වෙබ්මාස්ටර් මාර්ගෝපදේශවල පැහැදිලිවම සඳහන් වන්නේ: “ඔබ පරිශීලකයින්ට පෙන්වීමට වඩා ඔබේ පරිශීලකයින් රැවටීමට හෝ සෙවුම් යන්ත්‍රවලට වෙනස් අන්තර්ගතයන් ඉදිරිපත් නොකරන්න, එය සාමාන්‍යයෙන්“ සළුව ”ලෙස හැඳින්වේ.” - සෙවුම් යන්ත්‍ර රොබෝවරුන් සඳහා පෙරහන් කරන mod_rewrite විධානයන් නිර්මාණය කිරීමෙන් වළකින්න.

එන්ජිම රොබෝවරු සොයන්න කැමති 1: 1 අන්තර්ගතයට: URI සිතියම් (මෙම අන්තර්ගතය වෙත ශ්රේණිගත සබැඳි සඳහා පදනම වේ) - ඔබ තාවකාලික යළි-යොමුකරයි නිර්මාණය කිරීමට mod_rewrite භාවිතා කරන්නේ හෝ ඔබ URI ගේ බහු යටතේ එකම අන්තර්ගතය සේවය කරනවා නම්, නියම සලකා කැනෝනිකල් URI තුළ ඔබේ HTML ලේඛන.

Mod_rewrite කාර්යය සඳහා සුදුසු මෙවලමක් ලෙස පෙනෙන නමුත් එසේ නොවන පොදු අවස්ථා තිබේද?

මෙය තනිවම විශාල (හා විවාදාත්මක) මාතෘකාවක් වන අතර, එක් එක් සිද්ධිය අනුව භාවිතයන් ආමන්ත්‍රණය කිරීමට වඩා හොඳ (IMHO) සහ යෝජනා කරන ලද යෝජනා ඔවුන්ගේ අවශ්‍යතාවන්ට ගැලපේද යන්න තීරණය කිරීමට අසන්නන්ට ඉඩ දෙන්න.

පොදු උදාහරණ මොනවාද?

AskApache හි mod_rewrite උපක්‍රම සහ ඉඟි නිරන්තරයෙන් මතු වන සෑම පොදු භාවිත අවස්ථාවක්ම ආවරණය කරයි, කෙසේ වෙතත්, දී ඇති පරිශීලකයෙකු සඳහා “නිවැරදි” විසඳුම රඳා පවතින්නේ පරිශීලකයාගේ වින්‍යාසය සහ පවතින විධානයන්හි නවීනත්වය මත ය (එබැවින් එය සාමාන්‍යයෙන් a mod_rewrite ප්‍රශ්නයක් පැමිණි විට පරිශීලකයා සතුව ඇති වෙනත් විධානයන් දැකීම හොඳ අදහසකි ).


AskApache සබැඳියට ස්තූතියි. ඒක තමයි මම හොයපු දේ!
sica07

AskApache විහිලුව නිල වශයෙන් ASF විසින් සහාය නොදක්වයි. ඔහු පවසන බොහෝ දේ විවාදාත්මක හෝ සරල වැරදි ය.
අනුවර්

@adaptr කරුණාකර ඔබ දන්නා උසස් සම්පත් බෙදා ගන්න.
danlefree

"mod_rewrite කාර්යය සඳහා සුදුසු මෙවලමක් ලෙස පෙනෙන්නට තිබුණත් එසේ නොවේද?" - සරල යළි-යොමුවීම්, mod_rewrite දැනටමත් භාවිතා නොකෙරේ. Mod_alias Redirectහෝ RedirectMatchඒ වෙනුවට භාවිතා කරන්න . Apache
ලියකියවිලිද

21

බොහෝ පරිපාලක / සංවර්ධකයින් මෙන්, මම වසර ගණනාවක් තිස්සේ නැවත ලිවීමේ නීති රීති සමඟ පොරබදමින් සිටින අතර පවත්නා අපාචේ ලියකියවිලි ගැන නොසතුටින් සිටිමි, එබැවින් අපාචේ mod_rewriteහි සෙසු අය සමඟ සැබවින්ම ක්‍රියා කරන ආකාරය හා ක්‍රියා කරන ආකාරය පිළිබඳ අවබෝධයක් ලබා ගැනීමට මම පෞද්ගලික ව්‍යාපෘතියක් ලෙස තීරණය කළෙමි. හරය, එබැවින් පසුගිය මාස කිහිපය තුළ මම මේ සියල්ල සමඟ straceහසුරුවීමක් ලබා ගැනීම සඳහා ප්‍රභව කේතයට + විදීම සමඟ පරීක්ෂණ අවස්ථා උපයෝගී කර ගතිමි .

රීති සංවර්ධකයින් නැවත ලිවීමට සලකා බැලිය යුතු ප්‍රධාන අදහස් කිහිපයක් මෙන්න:

  • කෙසේ වෙතත් නැවත ලිවීමේ සමහර අංග සේවාදායක වින්‍යාසය, අථත්‍ය ධාරක, නාමාවලිය, .htaccess සැකසුම් සඳහා පොදු වේ
  • PerDir ( .htaccess) සැකසීමට වඩා සමහර සැකසුම් මූල වින්‍යාසය (සේවාදායක වින්‍යාසය, අථත්‍ය ධාරක සහ නාමාවලිය) සඳහා බෙහෙවින් වෙනස් ය .
  • නරකම දෙය නම්, පර්ඩිර් සැකසුම් මගින් අභ්‍යන්තර පුනරාවර්තන පාපැදි පැදවීම අවිවාදයෙන්ම පාහේ අවුලුවාලිය හැකි බැවින්, එවැනි පර්ඩිර් සැකසුම් මඟින් මෙය අවුලුවන බව මූල වින්‍යාස අංග දැන සිටිය යුතුය.

මේ නිසා ඔබට නැවත ලිවීමේ පරිශීලක ප්‍රජාවන් කොටස් දෙකකට බෙදිය යුතු අතර ඒවා සම්පූර්ණයෙන්ම වෙන් වෙන් වශයෙන් සැලකිය යුතුය.

  • Apache වින්‍යාසයට මූල ප්‍රවේශය ඇති අය . මේවා සාමාන්‍යයෙන් යෙදුම් කැපවූ සේවාදායකයක් / වීඑම් එකක් සහිත පරිපාලක / සංවර්ධකයෙකු වන අතර මෙහි පණිවිඩය තරමක් සරල ය: හැකි .htaccessනම් ගොනු භාවිතා කිරීමෙන් වළකින්න ; ඔබගේ සේවාදායකයේ හෝ වොස්ට් වින්‍යාසය තුළ සියල්ල කරන්න. සංවර්ධකයාට නිදොස්කරණය සැකසිය හැකි බැවින් සහ නැවත ලිවීම.ලොග් ලිපිගොනු වෙත ප්‍රවේශය ඇති බැවින් නිදොස්කරණය සාධාරණයි.

  • හවුල් සත්කාරක සේවාවක (SHS) පරිශීලකයින් .

    • එම භාවිතා කරන්නන්ගේ ඇති භාවිතා කිරීමට .htaccessලබා ගත හැකි කිසිදු විකල්පයක් නැතැයි ලෙස සකසන / Perdir.
    • නරකම දෙය නම්, එවැනි පරිශීලකයින්ගේ නිපුණතා මට්ටම (mod_rewrite හි රීජෙක්ස් විසින් මෙහෙයවන ලද ඉණිමඟ-තර්කනය භාවිතා කරන තාක් දුරට) පළපුරුදු පරිපාලකයින්ට වඩා සැලකිය යුතු ලෙස අඩු වීමයි.
    • අපාචේ සහ සත්කාරක සැපයුම්කරුවන් නිදොස්කරණය / රෝග විනිශ්චය සහාය ලබා නොදේ. එකම රෝග විනිශ්චය තොරතුරු වන්නේ සාර්ථක යළි හරවා යැවීමකි, වැරදි යූආර්අයි වෙත හරවා යැවීමකි. හෝ 404/500 තත්ව කේතය. මෙය ඔවුන් ව්‍යාකූලත්වයට හා අසරණභාවයට පත් කරයි.
    • මෙම භාවිත අවස්ථාව සඳහා නැවත ලිවීම ක්‍රියාත්මක වන ආකාරය පැහැදිලි කරමින් අපාචේ අතිශයින් දුර්වල ය. උදාහරණයක් ලෙස එය PerDir .htaccessගොනුව තෝරාගෙන ඇත්තේ කුමක්ද සහ ඇයි යන්න පිළිබඳ පැහැදිලි පැහැදිලි කිරීමක් සපයන්නේ නැත . පර්ඩිර් පාපැදි පැදීමේ සංකීර්ණතා සහ මෙය වළක්වා ගන්නේ කෙසේද යන්න එහි විස්තර නොකරයි.

තුන්වන ප්‍රජාවක් තිබිය හැකිය: කඳවුරු දෙකෙහිම අඩියක් අවසන් කර ඉහත ප්‍රතිවිපාක විඳීමට සිදුවන SHS සැපයුම්කරුවන්ගේ පරිපාලක සහ සහායක කාර්ය මණ්ඩලය.

මම ලිපි ශෛලියේ බ්ලොග් සටහන් කිහිපයක් ලියා ඇත (උදා . .Htaccess ලිපිගොනු වල නැවත ලිවීමේ රීති භාවිතා කිරීම පිළිබඳ වැඩි විස්තර ) මෙම සවිස්තරාත්මක කරුණු රාශියක් ආවරණය කරයි. මට මගේම හවුල් සේවාවක් ඇති අතර කැපවූ සහ වීඑම් ෆ්ලොස් ව්‍යාපෘති සඳහා සහාය වේ. මම මගේ SHS ගිණුම සඳහා පරීක්ෂණ වාහනයක් ලෙස සම්මත LAMP VM භාවිතා කිරීම ආරම්භ කළ නමුත් අවසානයේදී නිසි දර්පණ VM එකක් කිරීම වඩා හොඳ බව මට පෙනී ගියේය ( මෙහි විස්තර කර ඇත ).

කෙසේ වෙතත්, පරිපාලක ප්‍රජාව .htaccessපරිශීලකයින්ට සහාය දැක්විය යුතු ආකාරය අනුව , අප දියුණු කළ යුතු සහ ඉදිරිපත් කළ යුතු යැයි මට හැඟේ:

  • PerDir සැකසුම් තුළ නැවත ලිවීමේ පද්ධතිය සැබවින්ම ක්‍රියාත්මක වන ආකාරය පිළිබඳ සංයුක්ත විස්තරයකි
  • .htaccessනැවත ලිවීමේ නීති ලිවිය යුතු ආකාරය පිළිබඳ මාර්ගෝපදේශ / හොඳම භාවිතයන් සමූහයකි
  • W3C html විග්‍රහයන්ට සමාන සරල වෙබ් පාදක නැවත ලිවීමේ ස්ක්‍රිප්ට් විග්‍රහයක්, නමුත් පරිශීලකයන්ට පරීක්ෂණ යූආර්අයි හෝ පරීක්ෂණ දෛශික ආදානය කළ හැකි අතර නැවත ලිවීමේ තර්කන ප්‍රවාහයේ ක්ෂණික ලොගයක් ලබා ගත හැකිය /
  • ඔබේ නීතිරීති වලින් ගොඩනංවන ලද රෝග විනිශ්චය ලබා ගන්නේ කෙසේද යන්න පිළිබඳ ඉඟි (උදා

    • ඉලක්කගත ස්ක්‍රිප්ටයට රෝග නිර්ණයන් ලෙස ලබා දීම සඳහා පසු විපරම් ($ N හෝ% N) පුළුල් [E=VAR:EXPR]කරන කාරණය සූරාකෑම භාවිතා කරන්න EXPR.
    • අභ්‍යන්තර නැවත හරවා යැවීමේ අවශ්‍යතාවයකින් තොරව සමස්ත නැවත ලිවීමේ යෝජනා ක්‍රමය ක්‍රියාත්මක වන පරිදි [OR], [C], [SKIP] සහ [L] කොඩි භාවිතයෙන් ඔබ නැවත ලිවීමේ නීති රීති ඇණවුම් කරන්නේ නම් , එවිට ඔබට මඟ හැරීම සඳහා පහත සඳහන් රීතිය 1 ලෙස එකතු කළ හැකිය. සියලු ලූප කරදර:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

මෙය මනාව ලේඛනගත කර ඇත. ප්‍රලේඛනය මෙය පැහැදිලි නොකරයි යැයි ඔබ කියන්නේ ඇයි?
අනුවර්

2
ඔබ කළ යුතුව ඇත්තේ .htaccessමාතෘකා වලට දායක වීම පමණක් වන අතර ඔබට පෙනෙනු ඇත. බොහෝ ආරම්භකයින් බලාපොරොත්තු රහිතව ව්‍යාකූලත්වයට පත්වේ - මේවායින් බොහොමයක් LAMP සේවාවක් පිළිබඳ පළමු අත්දැකීම සහ හවුල් සේවාවක් මත mod_rewrite ඇති අතර එම නිසා පද්ධතියට / වොස්ට් වින්‍යාසයන්ට මූල ප්‍රවේශයක් නොමැති අතර .htaccessලිපිගොනු හරහා එක් එක් සැකසුම් සඳහා භාවිතා කිරීමට සිදුවේ . ආරම්භකයාට "ලේ ගැලීම" සඳහා වැදගත් වෙනස්කම් තිබේ. මම බලශක්තිය භාවිතා කරන්නෙකු ලෙස සලකන අතර තවමත් සියුම් බව සොයාගනිමි. මා පවසන පරිදි, සමහර අංශ සකස් කිරීම සඳහා මට ස්ට්‍රේස් සහ ප්‍රභව කේත පරිලෝකනය කිරීමට සිදු විය. එස් අවශ්‍ය නොවේ. :-(
TerryE

මම සම්පූර්ණයෙන්ම එකඟයි. "නැවත ලිවීමේ පරිශීලක ප්‍රජාවන් කොටස් දෙකකට බෙදිය යුතු අතර ඒවා සම්පූර්ණයෙන්ම වෙනම ලෙස සැලකිය යුතුය." සමහර පරිශීලකයින් හවුල් සත්කාරක සේවා භාවිතා කරන අතර විශේෂ .යින් සඳහා පවා එය ඉතා බිඳෙන සුළු, සංකීර්ණ හා ව්‍යාකූල වන විශ්වාසය තැබිය යුතුය.htaccess . මට තවමත් කරදරයක් තිබේ.
රයන්

15

නැවත ලිවීම සිතියම භාවිතා කිරීම

නැවත ලිවීමේ සිතියම් සමඟ ඔබට කළ හැකි බොහෝ දේ ඇත. Rewritemap ප්‍රකාශය Rewritemap විධානය භාවිතා කර ප්‍රකාශයට පත් කරනු ලබන අතර පසුව එය RewritCond ඇගයීම් වලදී සහ RewriteRule Subtitutions යන දෙඅංශයෙන්ම භාවිතා කළ හැකිය.

RewriteMap සඳහා වන සාමාන්‍ය වාක්‍ය ඛණ්ඩය:

RewriteMap MapName MapType:MapSource

උදාහරණයක් වශයෙන්:

RewriteMap examplemap txt:/path/to/file/map.txt

ඔබට පසුව මෙවැනි ඉදිකිරීම් සඳහා සිතියම් නාමය භාවිතා කළ හැකිය:

${examplemap:key}

සිතියමේ යතුරු / අගය යුගල අඩංගු වේ. යතුර සොයාගත හොත්, අගය අඩු වේ. සරල සිතියම් යනු සරල පෙළ ගොනු පමණි, නමුත් ඔබට හැෂ් සිතියම් සහ SQL විමසුම් පවා භාවිතා කළ හැකිය. වැඩි විස්තර ලේඛනයේ ඇත:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

නොසැලකිලිමත් නූල්.

සමහර හැසිරවීම් කිරීමට ඔබට භාවිතා කළ හැකි අභ්‍යන්තර සිතියම් හතරක් ඇත. විශේෂයෙන් ගැලවී නොයන නූල් ප්‍රයෝජනවත් විය හැකිය.

උදාහරණයක් ලෙස: විමසුම් දාමයේ "කැෆේ" නූල සඳහා පරීක්ෂා කිරීමට මට අවශ්‍යය. කෙසේ වෙතත්, බ්‍රව්සරය මගේ සේවාදායකයට යැවීමට පෙර මෙයින් ගැලවී යනු ඇත, එබැවින් මා ගැලපීමට කැමති සෑම නූලකටම URL ගැලවී ගිය අනුවාදය කුමක්දැයි සොයා ගැනීමට මට අවශ්‍ය වනු ඇත, නැතහොත් මට එය මඟ හැරිය හැක ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

විමසුම් වචන පරාමිතිය අල්ලා ගැනීමට මම එක් රිව්රයිට්කොන්ඩ් එකක් භාවිතා කරන ආකාරය සැලකිල්ලට ගන්න, ඉන්පසු දෙවන නැවත ලිවීමේ කොන්ඩ් හි සිතියම භාවිතයෙන් එය මඟහරවා ගන්න. මෙය පසුව සංසන්දනය වේ. නැවත ලිවීමේ සිතියමේ යතුර ලෙස මට% 2 අවශ්‍ය වන්නේ කෙසේද යන්නත් සටහන් කරන්න,% 1 හි "පිහිටීම" හෝ "ස්ථානය" අඩංගු වේ. කණ්ඩායම් රටාවන්ට ඔබ වරහන් භාවිතා කරන විට ඒවා ද ග්‍රහණය කර ගනු ඇත.


අවසාන වාක්‍යය සත්‍ය නොවේ. මෙම mod_rewriteregexp එන්ජින් ආධාරක නොවන අල්ලා වැනි කණ්ඩායම් (?:location|place)සහ මෙම පමණක් උදාහරණයක් එක් ග්රහණ ඇත.
ටෙරී ඊ

12

නැවත ලිවීමේ නීති ලිවීමේදී වඩාත් පොදු වැරදි / අන්තරායන් මොනවාද?

පෙනෙන මාර්ගය වෙනස් කරන URL නැවත ලිවීමේදී සැබවින්ම පහසු අනතුරක් වේ, උදා. /base/1234/index.htmlසිට /base/script.php?id=1234. ස්ක්‍රිප්ට් ස්ථානයට සාපේක්ෂ මාර්ග ඇති ඕනෑම පින්තූරයක් හෝ CSS එකක් සේවාදායකයාට සොයාගත නොහැක. මෙය විසඳීම සඳහා විකල්ප ගණනාවක් මෙම වර්‍ගයෙන් සොයාගත හැකිය .


1
සබැඳියට ස්තූතියි. විශේෂයෙන් නැවත ලිවීමට හුරු නැති වෙනත් කණ්ඩායම් සාමාජිකයන් සමඟ වැඩ කරන විට, <base>අනුගමනය කිරීමට වඩාත් පහසු සහ තවමත් සාපේක්ෂ මාර්ග සක්‍රීය කිරීමට ටැගයක් එක් කිරීම මට පෙනේ .
kontur
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.