رمزگذاری URL

بعضی از کاراکترها نمی‌توانند بخشی از یک URL باشند (مثلاً فاصله) و بعضی دیگر از کاراکترها معنای خاصی در URL دارند. در فرم‌های HTML، از کاراکتر = برای جدا کردن نام از مقدار استفاده می‌شود. سینتکس عمومی URI از کدگذاری URL برای مقابله با این مشکل استفاده می‌کند، در حالی که فرم‌های HTML به جای اعمال کدگذاری درصد برای همه این کاراکترها، جایگزینی‌های اضافی انجام می‌دهند.

برای مثال، فاصله‌ها در یک رشته یا با %20 کدگذاری می‌شوند یا با علامت جمع ( + ) جایگزین می‌شوند. اگر از کاراکتر پایپ ( | ) به عنوان جداکننده استفاده می‌کنید، حتماً پایپ را به صورت %7C کدگذاری کنید. ویرگول در یک رشته باید به صورت %2C کدگذاری شود.

توصیه می‌شود از کتابخانه‌های ساخت URL معمولی پلتفرم خود برای رمزگذاری خودکار URLهای خود استفاده کنید تا مطمئن شوید URLها به درستی برای پلتفرم شما escape شده‌اند.

ساخت یک URL معتبر

ممکن است فکر کنید که یک URL «معتبر» بدیهی است، اما کاملاً اینطور نیست. برای مثال، یک URL که در نوار آدرس مرورگر وارد می‌شود، ممکن است حاوی کاراکترهای خاص باشد (مثلاً "上海+中國" )؛ مرورگر باید قبل از ارسال، آن کاراکترها را به صورت داخلی به یک کدگذاری متفاوت ترجمه کند. به همین ترتیب، هر کدی که ورودی UTF-8 را تولید یا می‌پذیرد، ممکن است URLهایی با کاراکترهای UTF-8 را به عنوان "معتبر" در نظر بگیرد، اما قبل از ارسال آنها به یک سرور وب، باید آن کاراکترها را نیز ترجمه کند. این فرآیند کدگذاری URL یا کدگذاری درصد نامیده می‌شود.

شخصیت‌های ویژه

ما نیاز به ترجمه کاراکترهای ویژه داریم زیرا همه URLها باید با سینتکس مشخص شده توسط مشخصات شناسه منبع یکسان (URI) مطابقت داشته باشند. در واقع، این بدان معناست که URLها باید فقط شامل یک زیرمجموعه خاص از کاراکترهای ASCII باشند: نمادهای الفبایی-عددی آشنا و برخی کاراکترهای رزرو شده برای استفاده به عنوان کاراکترهای کنترلی در URLها. این جدول این کاراکترها را خلاصه می‌کند:

خلاصه‌ای از کاراکترهای معتبر URL
تنظیم شخصیت‌ها استفاده از آدرس اینترنتی (URL)
الفبایی-عددی abcdefghijklm nopqrstuvwxyz ABCDEFGHIJKLM NOPQRSTUVWXYZ 0 1 2 3 4 5 6 7 8 9 رشته‌های متنی، استفاده از طرح ( http )، پورت ( 8080 ) و غیره.
بدون رزرو - _ . ~ رشته‌های متنی
رزرو شده ! * '(); : @ & = + $ , / ? % # [ ] کاراکترهای کنترلی و/یا رشته‌های متنی

هنگام ساخت یک URL معتبر، باید مطمئن شوید که فقط شامل کاراکترهای نشان داده شده در جدول است. تطبیق یک URL با استفاده از این مجموعه کاراکترها عموماً منجر به دو مشکل می‌شود، یکی حذف و دیگری جایگزینی:

  • کاراکترهایی که می‌خواهید مدیریت کنید، خارج از مجموعه فوق هستند. برای مثال، کاراکترهای زبان‌های خارجی مانند上海+中國باید با استفاده از کاراکترهای فوق کدگذاری شوند. طبق قرارداد رایج، فاصله (که در URLها مجاز نیست) اغلب با استفاده از کاراکتر جمع '+' نیز نمایش داده می‌شود.
  • کاراکترهایی در مجموعه فوق به عنوان کاراکترهای رزرو شده وجود دارند، اما باید به صورت تحت‌اللفظی استفاده شوند. برای مثال، ? در URLها برای نشان دادن ابتدای رشته پرس‌وجو استفاده می‌شود؛ اگر می‌خواهید از رشته "? و Mysterions" استفاده کنید، باید کاراکتر '?' را رمزگذاری کنید.

تمام کاراکترهایی که قرار است رمزگذاری URL شوند، با استفاده از یک کاراکتر '%' و یک مقدار هگز دو کاراکتری مربوط به کاراکتر UTF-8 خود رمزگذاری می‌شوند. برای مثال،上海+中國در UTF-8 به صورت %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B رمزگذاری URL می‌شوند. رشته ? and the Mysterians به صورت %3F+and+the+Mysterians یا %3F%20and%20the%20Mysterians رمزگذاری URL می‌شوند.

کاراکترهای رایجی که نیاز به کدگذاری دارند

برخی از کاراکترهای رایج که باید رمزگذاری شوند عبارتند از:

شخصیت ناامن مقدار کدگذاری شده
فضا %20
« %22
< %3C
> %3E
# %23
% %25
| %7C

تبدیل URL ای که از ورودی کاربر دریافت می‌کنید، گاهی اوقات دشوار است. برای مثال، ممکن است کاربر آدرسی به صورت "خیابان پنجم و اصلی" وارد کند. به طور کلی، شما باید URL خود را از بخش‌های آن بسازید و هر ورودی کاربر را به عنوان کاراکترهای تحت‌اللفظی در نظر بگیرید.

علاوه بر این، URL ها برای همه سرویس‌های وب پلتفرم نقشه‌های گوگل و API های وب استاتیک به ۱۶۳۸۴ کاراکتر محدود می‌شوند. برای اکثر سرویس‌ها، این محدودیت کاراکتر به ندرت رعایت می‌شود. با این حال، توجه داشته باشید که برخی سرویس‌ها پارامترهای متعددی دارند که ممکن است منجر به URL های طولانی شوند.

،

بعضی از کاراکترها نمی‌توانند بخشی از یک URL باشند (مثلاً فاصله) و بعضی دیگر از کاراکترها معنای خاصی در URL دارند. در فرم‌های HTML، از کاراکتر = برای جدا کردن نام از مقدار استفاده می‌شود. سینتکس عمومی URI از کدگذاری URL برای مقابله با این مشکل استفاده می‌کند، در حالی که فرم‌های HTML به جای اعمال کدگذاری درصد برای همه این کاراکترها، جایگزینی‌های اضافی انجام می‌دهند.

برای مثال، فاصله‌ها در یک رشته یا با %20 کدگذاری می‌شوند یا با علامت جمع ( + ) جایگزین می‌شوند. اگر از کاراکتر پایپ ( | ) به عنوان جداکننده استفاده می‌کنید، حتماً پایپ را به صورت %7C کدگذاری کنید. ویرگول در یک رشته باید به صورت %2C کدگذاری شود.

توصیه می‌شود از کتابخانه‌های ساخت URL معمولی پلتفرم خود برای رمزگذاری خودکار URLهای خود استفاده کنید تا مطمئن شوید URLها به درستی برای پلتفرم شما escape شده‌اند.

ساخت یک URL معتبر

ممکن است فکر کنید که یک URL «معتبر» بدیهی است، اما کاملاً اینطور نیست. برای مثال، یک URL که در نوار آدرس مرورگر وارد می‌شود، ممکن است حاوی کاراکترهای خاص باشد (مثلاً "上海+中國" )؛ مرورگر باید قبل از ارسال، آن کاراکترها را به صورت داخلی به یک کدگذاری متفاوت ترجمه کند. به همین ترتیب، هر کدی که ورودی UTF-8 را تولید یا می‌پذیرد، ممکن است URLهایی با کاراکترهای UTF-8 را به عنوان "معتبر" در نظر بگیرد، اما قبل از ارسال آنها به یک سرور وب، باید آن کاراکترها را نیز ترجمه کند. این فرآیند کدگذاری URL یا کدگذاری درصد نامیده می‌شود.

شخصیت‌های ویژه

ما نیاز به ترجمه کاراکترهای ویژه داریم زیرا همه URLها باید با سینتکس مشخص شده توسط مشخصات شناسه منبع یکسان (URI) مطابقت داشته باشند. در واقع، این بدان معناست که URLها باید فقط شامل یک زیرمجموعه خاص از کاراکترهای ASCII باشند: نمادهای الفبایی-عددی آشنا و برخی کاراکترهای رزرو شده برای استفاده به عنوان کاراکترهای کنترلی در URLها. این جدول این کاراکترها را خلاصه می‌کند:

تنظیم شخصیت‌ها استفاده از آدرس اینترنتی (URL)
الفبایی-عددی abcdefghijklm nopqrstuvwxyz ABCDEFGHIJKLM NOPQRSTUVWXYZ 0 1 2 3 4 5 6 7 8 9 رشته‌های متنی، استفاده از طرح ( http )، پورت ( 8080 ) و غیره.
بدون رزرو - _ . ~ رشته‌های متنی
رزرو شده ! * '(); : @ & = + $ , / ? % # [ ] کاراکترهای کنترلی و/یا رشته‌های متنی

هنگام ساخت یک URL معتبر، باید مطمئن شوید که فقط شامل کاراکترهای نشان داده شده در جدول است. تطبیق یک URL با استفاده از این مجموعه کاراکترها عموماً منجر به دو مشکل می‌شود، یکی حذف و دیگری جایگزینی:

  • کاراکترهایی که می‌خواهید مدیریت کنید، خارج از مجموعه فوق هستند. برای مثال، کاراکترهای زبان‌های خارجی مانند上海+中國باید با استفاده از کاراکترهای فوق کدگذاری شوند. طبق قرارداد رایج، فاصله (که در URLها مجاز نیست) اغلب با استفاده از کاراکتر جمع '+' نیز نمایش داده می‌شود.
  • کاراکترهایی در مجموعه فوق به عنوان کاراکترهای رزرو شده وجود دارند، اما باید به صورت تحت‌اللفظی استفاده شوند. برای مثال، ? در URLها برای نشان دادن ابتدای رشته پرس‌وجو استفاده می‌شود؛ اگر می‌خواهید از رشته "? و Mysterions" استفاده کنید، باید کاراکتر '?' را رمزگذاری کنید.

تمام کاراکترهایی که قرار است رمزگذاری URL شوند، با استفاده از یک کاراکتر '%' و یک مقدار هگز دو کاراکتری مربوط به کاراکتر UTF-8 خود رمزگذاری می‌شوند. برای مثال،上海+中國در UTF-8 به صورت %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B رمزگذاری URL می‌شوند. رشته ? and the Mysterians به صورت %3F+and+the+Mysterians یا %3F%20and%20the%20Mysterians رمزگذاری URL می‌شوند.

کاراکترهای رایجی که نیاز به کدگذاری دارند

برخی از کاراکترهای رایج که باید رمزگذاری شوند عبارتند از:

شخصیت ناامن مقدار کدگذاری شده
فضا %20
« %22
< %3C
> %3E
# %23
% %25
| %7C

تبدیل URL ای که از ورودی کاربر دریافت می‌کنید، گاهی اوقات دشوار است. برای مثال، ممکن است کاربر آدرسی به صورت "خیابان پنجم و اصلی" وارد کند. به طور کلی، شما باید URL خود را از بخش‌های آن بسازید و هر ورودی کاربر را به عنوان کاراکترهای تحت‌اللفظی در نظر بگیرید.

علاوه بر این، URL ها برای همه سرویس‌های وب پلتفرم نقشه‌های گوگل و API های وب استاتیک به ۱۶۳۸۴ کاراکتر محدود می‌شوند. برای اکثر سرویس‌ها، این محدودیت کاراکتر به ندرت رعایت می‌شود. با این حال، توجه داشته باشید که برخی سرویس‌ها پارامترهای متعددی دارند که ممکن است منجر به URL های طولانی شوند.