ToolDeck

تجزیه‌گر URL

یک URL را به اجزای آن تجزیه کنید — پروتکل، میزبان، مسیر، پارامترهای کوئری، هش

یک مثال امتحان کنید
همچنین امتحان کنید:URL Encode OnlineURL Decode Online

تجزیه URL چیست؟

تجزیه URL فرآیند تقسیم یک Uniform Resource Locator به اجزای جداگانه آن است: پروتکل (scheme)، نام میزبان، پورت، مسیر، پارامترهای کوئری و شناسه قطعه. هر URL از ساختاری پیروی می‌کند که توسط RFC 3986 و استاندارد WHATWG URL تعریف شده است. یک تجزیه‌گر URL رشته خام را می‌خواند، هر بخش را با کمک کاراکترهای جداکننده (://، :، /، ?، #، &، =) شناسایی می‌کند و آن‌ها را به‌صورت فیلدهای مجزا و قابل دسترس بازمی‌گرداند.

مرورگرها هر بار که آدرسی تایپ می‌کنید یا روی پیوندی کلیک می‌کنید، عملیات تجزیه URL انجام می‌دهند. سازنده URL در JavaScript، ماژول urllib.parse در Python و بسته net/url در Go همگی تجزیه‌گرهایی را پیاده‌سازی می‌کنند که از همین قوانین ساختاری پیروی می‌کنند. تجزیه یک URL مکملِ رمزگذاری URL است: به‌جای تبدیل کاراکترها برای انتقال امن، یک URL از پیش ساخته‌شده را به بخش‌های تشکیل‌دهنده‌اش تجزیه می‌کنید.

یک URL معمول مانند https://api.example.com:8080/v1/users?page=2&limit=10#section شامل شش جزء متمایز است. کاراکترهای جداکننده — ://، :، /، ?، &، = و # — هستند که تجزیه را ممکن می‌کنند: هر کدام یک مرز را نشان می‌دهند و به تجزیه‌گر اجازه می‌دهند بدون ابهام فیلدها را استخراج کند.

چرا از یک تجزیه‌گر URL آنلاین استفاده کنیم؟

تجزیه دستی یک URL مستعد خطاست، به‌ویژه وقتی رشته شامل کاراکترهای رمزگذاری‌شده، پارامترهای کوئری متعدد یا پورت‌های غیراستاندارد باشد. این ابزار URL را با همان الگوریتم سازگار با WHATWG که مرورگرها استفاده می‌کنند تجزیه می‌کند و هر جزء را در جدولی شفاف و قابل کپی نمایش می‌دهد.

تجزیه فوری در مرورگر
هر URL را جای‌گذاری کنید و تمام اجزا را فوراً مشاهده کنید. بدون بارگذاری مجدد صفحه، بدون فراخوانی سرور، بدون انتظار.
🔒
URL‌های خود را خصوصی نگه دارید
تجزیه کاملاً در مرورگر شما با استفاده از URL API بومی انجام می‌شود. URL وارد شده هرگز دستگاه شما را ترک نمی‌کند.
🔍
هر جزئیاتی را بررسی کنید
پروتکل، نام میزبان، پورت، مسیر، رشته کوئری، هش و هر پارامتر کوئری به‌همراه مقدار رمزگشایی‌شده‌اش را ببینید.
📋
اجزای جداگانه را کپی کنید
روی دکمه کپی کنار هر فیلد کلیک کنید تا مقدار دقیق را بگیرید. نیازی به انتخاب دستی و برش زیررشته‌ها نیست.

موارد استفاده تجزیه‌گر URL

اشکال‌زدایی مسیریابی فرانت‌اند
بررسی کنید که بخش‌های مسیر و قطعه‌های هش با پیکربندی مسیریاب شما مطابقت دارند. اسلش‌های نابجا یا پارامترهای کوئری غیرمنتظره را پیش از ایجاد خطای 404 شناسایی کنید.
اعتبارسنجی نقاط پایانی API سمت سرور
پیش از نوشتن کنترل‌کننده‌های مسیر یا میان‌افزار، بررسی کنید که URL درخواست‌های دریافتی شامل نام میزبان، پورت و ساختار مسیر صحیح باشند.
آزمایش قوانین ریدایرکت DevOps
هنگام نوشتن قوانین ریدایرکت در Nginx، Apache یا CDN، URL‌های مبدا و مقصد را تجزیه کنید تا مطمئن شوید هر جزء به‌درستی نگاشت می‌شود.
تأیید پیوندها در QA
URL‌های گزارش‌های آزمایشی یا تیکت‌های باگ را تجزیه کنید تا مشخص شود کدام پارامتر کوئری یا قطعه باعث بارگذاری صفحه اشتباه می‌شود.
استخراج URL در پایپلاین داده
نام میزبان یا بخش‌های مسیر را از URL‌های فایل‌های لاگ یا داده‌های آنالیتیک استخراج کنید تا گزارش‌های سطح دامنه بسازید یا ترافیک را بر اساس نقطه پایانی فیلتر کنید.
یادگیری ساختار URL
دانشجویان و توسعه‌دهندگانی که با پروتکل‌های وب آشنا نیستند می‌توانند URL‌های واقعی را جای‌گذاری کنند و فوراً ببینند کدام جداکننده کدام مرز را مشخص می‌کند.

مرجع اجزای URL

جدول زیر هر خاصیتی را که سازنده JavaScript URL هنگام تجزیه یک URL بازمی‌گرداند نشان می‌دهد. همین اجزا در نتیجه urlparse پایتون، ساختار url.URL در Go و خروجی parse_url در PHP نیز وجود دارند، هرچند نام خاصیت‌ها در زبان‌های مختلف متفاوت است.

خاصیتنمونهتوضیح
protocolhttps:Scheme including the trailing colon
hostnameapi.example.comDomain name or IP address
port8080Port number (empty string if default)
pathname/v1/usersPath starting with /
search?page=2&limit=10Query string including the leading ?
hash#sectionFragment identifier including the leading #
originhttps://api.example.com:8080protocol + hostname + port
hostapi.example.com:8080hostname + port
usernameadminCredentials before @ (rarely used in practice)
passwordsecretCredentials before @ (avoid in production URLs)
href(full URL)The complete, serialized URL string

استاندارد WHATWG URL در مقابل RFC 3986

دو مشخصه نحوه تجزیه URL‌ها را تعریف می‌کنند. در ساختار اصلی توافق دارند اما در موارد مرزی متفاوت عمل می‌کنند — و این تفاوت معمولاً همان دلیلی است که مرورگر شما یک URL را متفاوت از سرورتان مدیریت می‌کند.

WHATWG URL Standard
توسط تمام مرورگرهای مدرن و سازنده JavaScript URL استفاده می‌شود. ورودی‌های ناقص را می‌پذیرد و نرمال‌سازی می‌کند: scheme‌های ناقص، بک‌اسلش به‌عنوان جداکننده مسیر، نام‌های میزبان غیر ASCII از طریق Punycode. به‌عنوان یک استاندارد زنده در url.spec.whatwg.org تعریف شده است.
RFC 3986
مشخصه رسمی IETF (۲۰۰۵). سخت‌گیرانه‌تر از WHATWG: برخی ورودی‌هایی که مرورگرها می‌پذیرند را رد می‌کند. توسط بسیاری از کتابخانه‌های سمت سرور از جمله net/url در Go و urllib.parse در Python استفاده می‌شود. در RFC 3986 تعریف شده است.

در عمل، بیشتر تفاوت‌ها هنگام تجزیه URL‌هایی با نام‌های دامنه بین‌المللی (IDN)، scheme‌های ناقص یا کاراکترهای غیرمعمول ظاهر می‌شوند. تجزیه‌گر WHATWG نام‌های میزبان IDN را به‌طور خودکار به Punycode تبدیل می‌کند، در حالی که تجزیه‌گرهای سخت‌گیر RFC 3986 ممکن است آن‌ها را رد کنند. اگر URL‌ای را در این ابزار جای‌گذاری کنید و نتایجی متفاوت از کد سمت سرور مشاهده کنید، احتمالاً تفاوت WHATWG در مقابل RFC دلیل اصلی است.

نمونه‌های کد

هر زبان اصلی یک تجزیه‌گر URL داخلی دارد. مثال‌های زیر همان URL را تجزیه می‌کنند و اجزای آن را استخراج می‌نمایند. توجه داشته باشید که نام‌گذاری در زبان‌های مختلف کمی متفاوت است: Python از scheme به‌جای protocol استفاده می‌کند و Go به‌جای search، RawQuery را در معرض دید قرار می‌دهد.

JavaScript (browser / Node.js)
const url = new URL('https://api.example.com:8080/v1/users?page=2&limit=10#section')

url.protocol  // → "https:"
url.hostname  // → "api.example.com"
url.port      // → "8080"
url.pathname  // → "/v1/users"
url.search    // → "?page=2&limit=10"
url.hash      // → "#section"

// Iterate over query parameters
for (const [key, value] of url.searchParams) {
  console.log(`${key} = ${value}`)
}
// → "page = 2"
// → "limit = 10"

// Modify and re-serialize
url.searchParams.set('page', '3')
url.toString()
// → "https://api.example.com:8080/v1/users?page=3&limit=10#section"
Python
from urllib.parse import urlparse, parse_qs

result = urlparse('https://api.example.com:8080/v1/users?page=2&limit=10#section')

result.scheme    # → 'https'
result.hostname  # → 'api.example.com'
result.port      # → 8080
result.path      # → '/v1/users'
result.query     # → 'page=2&limit=10'
result.fragment  # → 'section'

# Parse query string into a dict
params = parse_qs(result.query)
params['page']   # → ['2']
params['limit']  # → ['10']

# Reconstruct with modifications
from urllib.parse import urlencode, urlunparse
new_query = urlencode({'page': '3', 'limit': '10'})
urlunparse(result._replace(query=new_query))
# → 'https://api.example.com:8080/v1/users?page=3&limit=10#section'
Go
package main

import (
	"fmt"
	"net/url"
)

func main() {
	u, err := url.Parse("https://api.example.com:8080/v1/users?page=2&limit=10#section")
	if err != nil {
		panic(err)
	}

	fmt.Println(u.Scheme)   // → "https"
	fmt.Println(u.Hostname()) // → "api.example.com"
	fmt.Println(u.Port())     // → "8080"
	fmt.Println(u.Path)       // → "/v1/users"
	fmt.Println(u.RawQuery)   // → "page=2&limit=10"
	fmt.Println(u.Fragment)   // → "section"

	// Query params as map
	q := u.Query()
	fmt.Println(q.Get("page"))  // → "2"
	fmt.Println(q.Get("limit")) // → "10"
}
PHP
<?php
$url = 'https://api.example.com:8080/v1/users?page=2&limit=10#section';
$parts = parse_url($url);

$parts['scheme'];   // → "https"
$parts['host'];     // → "api.example.com"
$parts['port'];     // → 8080
$parts['path'];     // → "/v1/users"
$parts['query'];    // → "page=2&limit=10"
$parts['fragment']; // → "section"

// Parse query string into an array
parse_str($parts['query'], $params);
$params['page'];    // → "2"
$params['limit'];   // → "10"

سؤالات متداول

تفاوت URL و URI چیست؟
URL (Uniform Resource Locator) نوع خاصی از URI (Uniform Resource Identifier) است که هم شناسه و هم مکانیسم دسترسی (scheme مانند https://) را در بر می‌گیرد. همه URL‌ها URI هستند، اما همه URI‌ها URL نیستند. یک URN مانند urn:isbn:0451450523 یک URI است که منبع را با نام شناسایی می‌کند بدون اینکه نحوه بازیابی آن را مشخص کند. در توسعه وب، این دو اصطلاح اغلب به‌جای هم استفاده می‌شوند چون تقریباً هر URI که با آن مواجه می‌شوید یک URL است.
سازنده URL با URL‌های نسبی چگونه برخورد می‌کند؟
سازنده JavaScript URL هنگام تجزیه مسیرهای نسبی به یک URL پایه نیاز دارد. فراخوانی new URL('/path?q=1') یک TypeError پرتاب می‌کند. باید یک پایه ارائه دهید: new URL('/path?q=1', 'https://example.com'). تابع urljoin در Python و url.ResolveReference در Go همین هدف را دنبال می‌کنند. این ابزار انتظار URL‌های کامل و مطلق با scheme دارد.
وقتی URL فاقد شماره پورت است چه اتفاقی می‌افتد؟
وقتی پورت حذف می‌شود، تجزیه‌گر برای خاصیت port یک رشته خالی برمی‌گرداند. مرورگر پورت پیش‌فرض scheme را فرض می‌کند: ۴۴۳ برای https، ۸۰ برای http، ۲۱ برای ftp. می‌توانید از طریق خاصیت origin یا host به پورت مؤثر دسترسی داشته باشید، اما فیلد port خود خالی می‌ماند چون هیچ پورت صریحی مشخص نشده است.
آیا URL می‌تواند شامل کاراکترهای Unicode باشد؟
بله، اما باید برای انتقال رمزگذاری شوند. استاندارد WHATWG URL این کار را به‌طور خودکار انجام می‌دهد: نام‌های دامنه بین‌المللی به Punycode (پیشوند xn--) تبدیل می‌شوند و کاراکترهای مسیر/کوئری خارج از محدوده ASCII به‌صورت درصد رمزگذاری می‌شوند. اگر یک URL با Unicode در این ابزار جای‌گذاری کنید، نسخه نرمال‌شده و سازگار با ASCII را در خروجی تجزیه‌شده مشاهده خواهید کرد.
حداکثر طول یک URL چقدر است؟
هیچ استانداردی حداکثر طول URL را تعریف نمی‌کند — RFC 3986 در این مورد ساکت است. در عمل، مرورگرها محدودیت‌هایی اعمال می‌کنند: Chrome تا حدود ۲ مگابایت در نوار آدرس پشتیبانی می‌کند، در حالی که Internet Explorer (نسخه قدیمی) محدودیت ۲٬۰۸۳ کاراکتری داشت. بیشتر سرورهای وب به‌طور پیش‌فرض ۸ کیلوبایت (Nginx) یا ۸ کیلوبایت (Apache) برای خط درخواست تعیین می‌کنند. اگر نیاز به ارسال داده‌های حجیم دارید، به‌جای رشته‌های کوئری از بدنه درخواست‌های POST استفاده کنید.
چطور می‌توانم فقط رشته کوئری را بدون URL کامل تجزیه کنم؟
در JavaScript، از new URLSearchParams('page=2&limit=10') برای تجزیه یک رشته کوئری تنها استفاده کنید. در Python، از urllib.parse.parse_qs('page=2&limit=10') استفاده کنید. هر دو پارامترها را به‌صورت جفت کلید-مقدار بازمی‌گردانند. این کاربرد مفید است وقتی رشته کوئری را به‌تنهایی دارید، مثلاً از یک ارسال فرم یا یک ورودی لاگ که فقط بخش کوئری را ضبط کرده است.
آیا تجزیه URL همان رمزگشایی URL است؟
خیر. تجزیه URL یک URL را به اجزای ساختاری (scheme، میزبان، مسیر، کوئری، قطعه) تقسیم می‌کند. رمزگشایی URL کاراکترهای درصد-رمزگذاری‌شده را به شکل اصلی‌شان بازمی‌گرداند (%20 به فاصله و %26 به & تبدیل می‌شود). این دو عملیات مکمل یکدیگرند: معمولاً ابتدا URL را تجزیه می‌کنید، سپس مقادیر اجزای جداگانه را رمزگشایی می‌کنید. رمزگشایی پیش از تجزیه می‌تواند ساختار URL را خراب کند، چون جداکننده‌های رمزگشایی‌شده مانند & و = به‌اشتباه تفسیر می‌شوند.