کتابخانه‌ی استاندارد · کدگذاری و داده

نشانی وب encoding/url

تجزیه‌ی نشانی وب به بخش‌هایش، ساختن و ویرایش پارامترها و پیوستن نشانی‌های نسبی.

واردسازی کدگذاری.نشانی وب

این بسته با نشانی‌های کامل وب کار می‌کند. تجزیه نشانی نشانی‌ای مثل https://[email protected]:8443/path?page=2#top را به ساختار نشانی وب با فیلدهای scheme، userinfo، host، port، path، raw_query و fragment می‌شکند و متن آن را دوباره سرهم می‌کند. در کنار این دو، تابع‌هایی برای ویرایش پارامترهای پرس‌وجو، کامل کردن پیوندهای نسبی با پیوستن نشانی و پیدا کردن دامنه‌ی ثبت‌شدنی یک میزبان هست.

هر وقت نشانی کامل در دست دارید از این بسته استفاده کنید. برای بخش a=1&b=2 به‌تنهایی، مثلاً بدنه‌ی یک فرم، بسته‌ی پرس‌وجو مناسب است؛ برای کدگذاری درصدی یک رشته‌ی تکی، کدگذاری نشانی در بسته‌ی کدگذاری؛ و برای گرفتن خود نشانی، اچ تی تی پی.

بخش‌های خام و کدگشایی‌شده

فیلدها متن را دقیقاً همان‌طور که آمده، همراه با گریزهای درصدی، نگه می‌دارند؛ برای همین متن(تجزیه نشانی(x)) معمولاً همان x را برمی‌گرداند. شکل خوانا را با مسیر کدگشایی‌شده، اطلاعات کاربر کدگشایی‌شده یا پرس‌وجو بخوانید. وقتی خودتان فیلدی را مقدار می‌دهید، متن کدگذاری‌شده در آن بگذارید: بخش‌های مسیر را با کدگذاری بخش مسیر بگریزانید و پرس‌وجو را با تنظیم پرس‌وجو بسازید.

اشتباه‌های رایج

  • تجزیه نشانی هیچ‌وقت شکست نمی‌خورد. هیچ اعتبارسنجی‌ای نمی‌کند: درگاهی که عدد نباشد 0 می‌شود، و متنی که :// ندارد (از جمله mailto:[email protected]) طرح و میزبان ندارد و تمامش در path می‌نشیند. پیش از اعتماد به نشانی‌ای که کاربر داده، scheme و host را خودتان بررسی کنید.
  • هیچ چیز کوچک نمی‌شود. در HTTPS://Shop.Example.COM بزرگی و کوچکی حروف در scheme و host می‌ماند و دامنه هم Example.COM برمی‌گرداند. پیش از مقایسه‌ی میزبان یا دامنه، با رشته.کوچک حروف را کوچک کنید.
  • ویرایش یک پارامتر کل پرس‌وجو را بازنویسی می‌کند. حذف پارامتر، تنظیم پارامتر و نگه داشتن پارامترها پرس‌وجو را کدگشایی و دوباره کدگذاری می‌کنند: %20 به + تبدیل می‌شود، نویسه‌هایی مثل * گریزانده می‌شوند، flag تنها به flag= تبدیل می‌شود و کلیدهای تکراری کنار هم قرار می‌گیرند. معنا همان می‌ماند، ولی متن ممکن است عوض شود.
  • پیوستن نشانی با ارجاعی که فقط ?پرسش یا #بخش است، نام پرونده‌ی پایه را از دست می‌دهد، برخلاف مرورگر. راهنمای پیوندها را ببینید.

راهنما: حذف پارامترهای ردیابی

پیوندهایی که از ایمیل و شبکه‌های اجتماعی کپی می‌شوند پارامترهای utm_ و شناسه‌ی کلیک دارند که فقط به کار آمارگیری می‌آیند. پیش از ذخیره یا مقایسه‌ی پیوندها، آن‌ها را تجزیه کنید، این پارامترها را با حذف پارامتر بردارید، بخش پس از # را پاک کنید و نتیجه را با متن بسازید. پارامترهایی که می‌مانند ترتیبشان را نگه می‌دارند.

encoding-url-guide-clean.salam
واردسازی کدگذاری.نشانی وب

تابع پاکسازی(خام: رشته): رشته:
    ناپایا ن := نشانی وب.تجزیه نشانی(خام)
    نام‌ها := نشانی وب.نام پارامترها(ن)
    هر نام در نام‌ها:
        اگر نام.شروع با("utm_") یا نام == "fbclid" یا نام == "gclid":
            _ := نشانی وب.حذف پارامتر(ن، نام)
        پایان
    پایان
    ن.قطعه = ""
    برگشت نشانی وب.متن(ن)
پایان

تابع ریشه:
    سرچاپ پاکسازی("https://shop.example/item/42?color=red&utm_source=news&utm_medium=email#reviews")
    سرچاپ پاکسازی("https://blog.example/post?fbclid=IwAR0abc")
    سرچاپ پاکسازی("https://example.com/search?q=salam%20lang&utm_campaign=fall&page=2&debug")
پایان
خروجیhttps://shop.example/item/42?color=red https://blog.example/post https://example.com/search?q=salam+lang&page=2&debug=

نام پارامترها رونوشتی از نام‌ها برمی‌گرداند، پس حذف پارامتر درون حلقه بی‌خطر است. فیلدهای نشانی وب رشته‌های ساده‌ای‌اند که می‌توانید مستقیم مقدار بدهید، مثل ن.fragment = "". سطر آخر همان بازنویسی‌ای را نشان می‌دهد که بالاتر گفته شد: salam%20lang به شکل salam+lang و debug تنها به شکل debug= درمی‌آید. برای سرور هر دو یک معنا دارند، ولی اگر پیوند پاک‌شده را کلید حافظه‌ی نهان یا پایگاه داده می‌کنید، همه‌ی پیوندها را به یک روش پاک کنید تا پیوندهای برابر متن برابر بدهند.

یک خزنده یا بررسی‌گر پیوند، پیوندهای نسبی مثل ../api/json.html را در صفحه پیدا می‌کند و نشانی کامل لازم دارد. پیوستن نشانی یک ارجاع را نسبت به نشانی خود صفحه همان‌طور که مرورگر می‌کند حل می‌کند: ./ و ../ در پوشه‌ها جابه‌جا می‌شوند، / در آغاز از ریشه‌ی پایگاه شروع می‌کند، //میزبان طرح نشانی را نگه می‌دارد و یک نشانی کامل جای همه چیز را می‌گیرد.

encoding-url-guide-links.salam
واردسازی کدگذاری.نشانی وب

تابع ریشه:
    صفحه := نشانی وب.تجزیه نشانی("https://docs.example.com/guide/start/index.html?lang=en")
    پیوندها := ["install.html"، "./setup/linux.html"، "../api/json.html"، "/blog/"، "https://other.example/x"، "//cdn.example.com/app.js"]
    هر پ در پیوندها:
        سرچاپ پ، "->"، نشانی وب.متن(نشانی وب.پیوستن نشانی(صفحه، پ))
    پایان
پایان
خروجیinstall.html -> https://docs.example.com/guide/start/install.html ./setup/linux.html -> https://docs.example.com/guide/start/setup/linux.html ../api/json.html -> https://docs.example.com/guide/api/json.html /blog/ -> https://docs.example.com/blog/ https://other.example/x -> https://other.example/x //cdn.example.com/app.js -> https://cdn.example.com/app.js

ارجاعی که فقط پرسش است (?lang=fa) یا فقط بخش پس از # (#top) هنوز نام پرونده‌ی پایه را نگه نمی‌دارد، پس این‌ها را خودتان حل کنید: روی رونوشتی از نشانی پایه raw_query یا fragment را تنظیم کنید.

راهنما: آیا همان پایگاه است؟

برای اینکه تغییر مسیر را فقط درون پایگاه خودتان مجاز کنید، یا پیوندها را بر پایه‌ی مالکشان دسته‌بندی کنید، دامنه‌ی ثبت‌شدنی را مقایسه کنید، نه نام میزبان را. دامنه بخشی است که کسی ثبت می‌کند، مثل example.co.uk؛ پسوند عمومی بخشی است که هر کسی زیر آن ثبت می‌کند؛ زیردامنه چیزی است که در سمت چپ می‌ماند. نشانی‌ای که از یک IP ساخته شده دامنه ندارد، پس آنجا نام میزبان را مقایسه کنید. نام میزبان به بزرگی و کوچکی حروف حساس نیست ولی بسته آن را دست نمی‌زند، برای همین برنامه پیش از تجزیه هر دو نشانی را کوچک می‌کند.

encoding-url-guide-site.salam
واردسازی کدگذاری.نشانی وب
واردسازی رشته

تابع هم پایگاه(الف: رشته، ب: رشته): منطقی:
    نا := نشانی وب.تجزیه نشانی(رشته.کوچک(الف))
    نب := نشانی وب.تجزیه نشانی(رشته.کوچک(ب))
    اگر نشانی وب.نشانی عددی است(نا) یا نشانی وب.نشانی عددی است(نب):
        برگشت نشانی وب.نام میزبان(نا) == نشانی وب.نام میزبان(نب)
    پایان
    برگشت نشانی وب.دامنه(نا) == نشانی وب.دامنه(نب)
پایان

تابع ریشه:
    ن := نشانی وب.تجزیه نشانی("https://api.eu.shop.example.co.uk:8443/v1/orders")
    سرچاپ "میزبان:"، نشانی وب.نام میزبان(ن)، "درگاه:"، ن.درگاه
    سرچاپ "دامنه:"، نشانی وب.دامنه(ن)، "پسوند:"، نشانی وب.پسوند عمومی(ن)، "زیردامنه:"، نشانی وب.زیردامنه(ن)

    سرچاپ هم پایگاه("https://www.example.com/a"، "https://login.example.com/b")
    سرچاپ هم پایگاه("https://WWW.Example.com/"، "https://example.com/cart")
    سرچاپ هم پایگاه("https://example.com/"، "https://example.org/")
    سرچاپ هم پایگاه("http://10.0.0.5:8080/"، "http://10.0.0.5/")
پایان
خروجیمیزبان: api.eu.shop.example.co.uk درگاه: 8443 دامنه: example.co.uk پسوند: co.uk زیردامنه: api.eu.shop true true false true

این بسته پسوندهای عمومی رایج مثل com، co.uk و com.au را می‌شناسد، نه فهرست کامل پسوندهای عمومی را، پس سکوهای میزبانی که به هر مشتری یک زیردامنه می‌دهند ممکن است یک پایگاه شمرده شوند. هر جا مهم است، این میزبان‌ها را با نامشان بررسی کنید.

راهنما: ساختن نشانی از ورودی کاربر

وقتی بخش‌هایی از نشانی از کاربر می‌آید، هر بخش مسیر را با کدگذاری بخش مسیر بگریزانید که / را هم می‌گریزاند تا نام یک پرونده نتواند پوشه‌ی تازه بسازد. پارامترها را در یک نگاشت پرس‌وجو بگذارید و با تنظیم پرس‌وجو به نشانی بچسبانید؛ افزودن اجازه می‌دهد یک کلید چند بار بیاید.

encoding-url-guide-build.salam
واردسازی کدگذاری.نشانی وب
واردسازی کدگذاری.پرس‌وجو

تابع ریشه:
    پوشه := "My Files"
    نام := "report 2026/Q3.pdf"
    ناپایا ن := نشانی وب.تجزیه نشانی("https://files.example.com")
    ن.مسیر = "/users/sara/" + نشانی وب.کدگذاری بخش مسیر(پوشه) + "/" + نشانی وب.کدگذاری بخش مسیر(نام)

    ناپایا پ := پرس‌وجو.نگاشت پرس‌وجو جدید()
    پرس‌وجو.تنظیم(پ، "download"، "1")
    پرس‌وجو.افزودن(پ، "tag"، "finance")
    پرس‌وجو.افزودن(پ، "tag"، "سه‌ماهه")
    نشانی وب.تنظیم پرس‌وجو(ن، پ)

    کامل := نشانی وب.متن(ن)
    سرچاپ کامل

    برگشتی := نشانی وب.تجزیه نشانی(کامل)
    سرچاپ "مسیر:"، نشانی وب.مسیر کدگشایی‌شده(برگشتی)
    سرچاپ "برچسب‌ها:"، پرس‌وجو.همه مقدارها(برگشتی.پرس‌وجوی خام، "tag")
پایان
خروجیhttps://files.example.com/users/sara/My%20Files/report%202026%2FQ3.pdf?download=1&tag=finance&tag=%D8%B3%D9%87%E2%80%8C%D9%85%D8%A7%D9%87%D9%87 مسیر: /users/sara/My Files/report 2026/Q3.pdf برچسب‌ها: ["finance", "سه‌ماهه"]

مسیر کدگشایی‌شده مسیر خوانا را می‌دهد ولی %2F را دوباره / می‌کند، پس نمی‌تواند خط مورب درون یک نام را از مرز پوشه جدا کند. وقتی نام‌ها را دقیق لازم دارید، اول ن.path را در / بشکنید و هر بخش را جدا کدگشایی کنید.

گونه‌ها

نشانی وب URL

ساختار نشانی وب
یک نشانی وب تجزیه‌شده.
نامانگلیسیگونهتوضیح
طرحschemeرشته = ""طرح، مثل https.
اطلاعات کاربرuserinfoرشته = ""نام کاربر و گذرواژه پیش از @، کدگذاری‌شده.
میزبانhostرشته = ""نام میزبان یا نشانی عددی.
درگاهportصحیح = 0درگاه؛ صفر اگر نیامده باشد.
مسیرpathرشته = ""مسیر، کدگذاری‌شده.
پرس‌وجوی خامraw_queryرشته = ""پرس‌وجو بعد از ?، کدگذاری‌شده.
قطعهfragmentرشته = ""بخش بعد از #.
encoding-url-Parse.salam
واردسازی کدگذاری.نشانی وب
واردسازی کدگذاری.پرس‌وجو

تابع ریشه:
    ناپایا ن := نشانی وب.تجزیه نشانی("https://user%20a:[email protected]:8443/کتاب/%D8%B3%D9%84%D8%A7%D9%85?page=2&sort=new#top")
    سرچاپ ن.طرح، ن.میزبان، ن.درگاه، ن.مسیر، ن.پرس‌وجوی خام، ن.قطعه
    سرچاپ نشانی وب.نام میزبان(ن)، نشانی وب.میزبان با درگاه(ن)، نشانی وب.نشانی عددی است(ن)
    سرچاپ نشانی وب.برچسب‌های میزبان(ن)، نشانی وب.پسوند عمومی(ن)، نشانی وب.دامنه(ن)، نشانی وب.زیردامنه(ن)
    سرچاپ نشانی وب.مسیر کدگشایی‌شده(ن)، نشانی وب.اطلاعات کاربر کدگشایی‌شده(ن)
    سرچاپ نشانی وب.نام پارامترها(ن)، پرس‌وجو.اندازه(نشانی وب.پرس‌وجو(ن))
    نشانی وب.تنظیم پارامتر(ن، "page"، "3")
    سرچاپ نشانی وب.حذف پارامتر(ن، "sort")، نشانی وب.متن(ن)
    ناپایا نگه := وکتور {} برگردان وکتور<رشته>
    نگه.بیفزا("page")
    نشانی وب.نگه داشتن پارامترها(ن، نگه)
    ناپایا پ := پرس‌وجو.نگاشت پرس‌وجو جدید()
    پرس‌وجو.افزودن(پ، "q"، "سلام دنیا")
    نشانی وب.تنظیم پرس‌وجو(ن، پ)
    سرچاپ نشانی وب.متن(ن)
    نشانی وب.پاک کردن پرس‌وجو(ن)
    سرچاپ نشانی وب.متن(ن)
    سرچاپ نشانی وب.متن(نشانی وب.پیوستن نشانی(ن، "../img/a.png"))، نشانی وب.کدگذاری بخش مسیر("a b/c")
    سرچاپ نشانی وب.نشانی عددی است(نشانی وب.تجزیه نشانی("http://127.0.0.1/"))
پایان
خروجیhttps shop.example.co.uk 8443 /کتاب/%D8%B3%D9%84%D8%A7%D9%85 page=2&sort=new top shop.example.co.uk shop.example.co.uk:8443 false ["shop", "example", "co", "uk"] co.uk example.co.uk shop /کتاب/سلام user a:pw ["page", "sort"] 2 true https://user%20a:[email protected]:8443/کتاب/%D8%B3%D9%84%D8%A7%D9%85?page=3#top https://user%20a:[email protected]:8443/کتاب/%D8%B3%D9%84%D8%A7%D9%85?q=%D8%B3%D9%84%D8%A7%D9%85+%D8%AF%D9%86%DB%8C%D8%A7#top https://user%20a:[email protected]:8443/کتاب/%D8%B3%D9%84%D8%A7%D9%85#top https://user%20a:[email protected]:8443/img/a.png a%20b%2Fc true

تابع‌ها

نام میزبان Hostname

تابع نام میزبان(u: نشانی وب): رشته
نام میزبان بدون درگاه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

نشانی عددی است IsIP

تابع نشانی عددی است(u: نشانی وب): منطقی
اگر میزبان چهار گروه رقم جداشده با نقطه باشد یا : داشته باشد (نشانی IPv6)، درست برمی‌گرداند. بازه‌ی رقم‌ها بررسی نمی‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

برچسب‌های میزبان Labels

تابع برچسب‌های میزبان(u: نشانی وب): وکتور<رشته>
بخش‌های نام میزبان، جداشده با نقطه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

پسوند عمومی PublicSuffix

تابع پسوند عمومی(u: نشانی وب): رشته
پسوند عمومی دامنه، مثل co.uk یا ir.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

دامنه Domain

تابع دامنه(u: نشانی وب): رشته
دامنه‌ی ثبت‌شده: یک بخش پیش از پسوند عمومی، مثل example.co.uk. نشانی IP یا میزبان تک‌بخشی مثل localhost بدون تغییر برمی‌گردد. بزرگی و کوچکی حروف حفظ می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

زیردامنه Subdomain

تابع زیردامنه(u: نشانی وب): رشته
هر چه پیش از دامنه‌ی ثبت‌شده می‌آید، مثل shop.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

حذف پارامتر RemoveParam

تابع حذف پارامتر(u &: نشانی وب، key: رشته): منطقی
همه‌ی مقدارهای یک پارامتر را برمی‌دارد و می‌گوید پارامتر وجود داشت یا نه. مثل دیگر تابع‌های پارامتر، بقیه‌ی پرس‌وجو را دوباره کدگذاری می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

تنظیم پارامتر SetParam

تابع تنظیم پارامتر(u &: نشانی وب، key: رشته، val: رشته)
پارامتر را روی یک مقدار می‌گذارد و مقدارهای قبلی‌اش را جایگزین می‌کند؛ نام تازه به انتها می‌رود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

نگه داشتن پارامترها KeepParams

تابع نگه داشتن پارامترها(u &: نشانی وب، keep: وکتور<رشته>)
فقط پارامترهای داده‌شده را نگه می‌دارد؛ برای پاک کردن پارامترهای ردیابی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

پاک کردن پرس‌وجو ClearQuery

تابع پاک کردن پرس‌وجو(u &: نشانی وب)
همه‌ی پرس‌وجو را برمی‌دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

نام پارامترها ParamNames

تابع نام پارامترها(u: نشانی وب): وکتور<رشته>
نام پارامترها، به ترتیب.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

تجزیه نشانی Parse

تابع تجزیه نشانی(raw: رشته): نشانی وب
نشانی را به بخش‌هایش تجزیه می‌کند. هیچ‌وقت شکست نمی‌خورد و اعتبارسنجی نمی‌کند: فقط متنی که :// (یا // در آغاز) دارد طرح و میزبان می‌گیرد، و درگاهی که عدد نباشد صفر می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

میزبان با درگاه HostPort

تابع میزبان با درگاه(u: نشانی وب): رشته
میزبان و درگاه با هم، مثل shop.example.co.uk:8443.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

متن String

تابع متن(u: نشانی وب): رشته
نشانی را دوباره به متن تبدیل می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

مسیر کدگشایی‌شده DecodedPath

تابع مسیر کدگشایی‌شده(u: نشانی وب): رشته
مسیر، با کدگذاری درصدی برگردانده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

اطلاعات کاربر کدگشایی‌شده DecodedUserinfo

تابع اطلاعات کاربر کدگشایی‌شده(u: نشانی وب): رشته
اطلاعات کاربر، کدگشایی‌شده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

کدگذاری بخش مسیر EncodePathSegment

تابع کدگذاری بخش مسیر(s: رشته): رشته
یک بخش مسیر را کدگذاری می‌کند؛ / هم کدگذاری می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

پرس‌وجو Query

تابع پرس‌وجو(u: نشانی وب): query.QueryMap
پرس‌وجوی نشانی را به یک نگاشت پرس‌وجو تبدیل می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

تنظیم پرس‌وجو SetQuery

تابع تنظیم پرس‌وجو(u &: نشانی وب، q: query.QueryMap)
پرس‌وجوی نشانی را با نگاشت داده‌شده جایگزین می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam

پیوستن نشانی Join

تابع پیوستن نشانی(base: نشانی وب، ref: رشته): نشانی وب
نشانی نسبی را روی نشانی پایه می‌سازد، مثل مرورگر؛ .. و . در مسیر حل می‌شوند. ارجاعی که فقط ?پرسش یا #بخش باشد نام پرونده‌ی پایه را می‌اندازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-url-Parse.salam