ToolDeck

ตัวแยกวิเคราะห์ URL

แยกวิเคราะห์ URL เป็นส่วนประกอบต่างๆ — โปรโตคอล โฮสต์ พาธ พารามิเตอร์ query และ hash

ลองตัวอย่าง
ลองดูด้วย:URL Encode OnlineURL Decode Online

การแยกวิเคราะห์ URL คืออะไร?

การแยกวิเคราะห์ URL คือกระบวนการแบ่ง Uniform Resource Locator ออกเป็นส่วนประกอบแต่ละส่วน ได้แก่ โปรโตคอล (scheme) โฮสต์เนม พอร์ต พาธ พารามิเตอร์ query และตัวระบุ fragment URL ทุกรายการเป็นไปตามโครงสร้างที่กำหนดโดย RFC 3986 และ WHATWG URL Standard ตัวแยกวิเคราะห์ URL จะอ่านสตริงดิบ ระบุแต่ละเซกเมนต์โดยอักขระตัวคั่น (://, :, /, ?, #, &, =) และส่งคืนเป็นฟิลด์แยกที่เข้าถึงได้

เบราว์เซอร์ทำการแยกวิเคราะห์ URL ทุกครั้งที่คุณพิมพ์ที่อยู่หรือคลิกลิงก์ JavaScript URL constructor, โมดูล urllib.parse ของ Python และแพ็กเกจ net/url ของ Go ล้วนใช้งาน parser ที่ปฏิบัติตามกฎโครงสร้างเดียวกัน การแยกวิเคราะห์ URL เป็นกระบวนการย้อนกลับของการเข้ารหัส URL: แทนที่จะแปลงอักขระเพื่อการส่งข้อมูลที่ปลอดภัย คุณแยกส่วนประกอบ URL ที่สร้างขึ้นแล้วออกเป็นชิ้นส่วนต่างๆ ที่ประกอบกันขึ้นมา

URL ทั่วไปเช่น https://api.example.com:8080/v1/users?page=2&limit=10#section มีส่วนประกอบหกส่วนที่แตกต่างกัน อักขระตัวคั่น — ://, :, /, ?, &, =, และ # — เป็นสิ่งที่ทำให้การแยกวิเคราะห์เป็นไปอย่างแน่นอน: แต่ละตัวส่งสัญญาณขอบเขตและช่วยให้ parser สามารถดึงฟิลด์ออกมาได้โดยไม่มีความกำกวม

ทำไมต้องใช้ตัวแยกวิเคราะห์ URL ออนไลน์?

การแบ่ง URL ด้วยตาเปล่าเสี่ยงต่อข้อผิดพลาด โดยเฉพาะเมื่อสตริงมีอักขระที่เข้ารหัส พารามิเตอร์ query หลายตัว หรือพอร์ตที่ไม่ใช่มาตรฐาน เครื่องมือนี้แยกวิเคราะห์ URL โดยใช้อัลกอริทึมที่สอดคล้องกับ WHATWG เดียวกับที่เบราว์เซอร์ใช้ และแสดงทุกส่วนประกอบในตารางที่ชัดเจนและสามารถคัดลอกได้

แยกวิเคราะห์ทันทีในเบราว์เซอร์ของคุณ
วางย URL ใดก็ได้และเห็นส่วนประกอบทั้งหมดแยกย่อยทันที ไม่ต้องโหลดหน้าใหม่ ไม่ต้องเรียก server ไม่ต้องรอ
🔒
รักษา URL ของคุณให้เป็นส่วนตัว
การแยกวิเคราะห์ทำงานทั้งหมดในเบราว์เซอร์ของคุณโดยใช้ native URL API URL ที่คุณป้อนจะไม่ออกจากเครื่องของคุณ
🔍
ตรวจสอบทุกรายละเอียด
ดูโปรโตคอล โฮสต์เนม พอร์ต พาธ query string hash และพารามิเตอร์ query แต่ละตัวพร้อมค่าที่ถอดรหัสแล้ว
📋
คัดลอกส่วนประกอบแต่ละชิ้น
คลิกปุ่มคัดลอกถัดจากฟิลด์ใดก็ได้เพื่อรับค่าที่แน่นอน ไม่ต้องเลือกและตัด substring ด้วยตนเอง

กรณีใช้งานตัวแยกวิเคราะห์ URL

การดีบัก frontend routing
ตรวจสอบว่าเซกเมนต์พาธและ hash fragment ตรงกับการตั้งค่า router ของคุณ หาสแลชที่วางผิดที่หรือพารามิเตอร์ query ที่ไม่คาดคิดก่อนที่จะทำให้เกิด 404
การตรวจสอบ endpoint ของ backend API
ยืนยันว่า URL request ที่เข้ามามีโฮสต์เนม พอร์ต และโครงสร้างพาธที่ถูกต้องก่อนเขียน route handler หรือ middleware
การทดสอบกฎ redirect ใน DevOps
เมื่อเขียนกฎ redirect สำหรับ Nginx, Apache หรือ CDN ให้แยกวิเคราะห์ URL ต้นทางและปลายทางเพื่อยืนยันว่าแต่ละส่วนประกอบ map กันอย่างถูกต้อง
การตรวจสอบลิงก์ใน QA
แยกวิเคราะห์ URL จากรายงานการทดสอบหรือ bug ticket เพื่อระบุว่าพารามิเตอร์ query หรือ fragment ใดที่ทำให้โหลดหน้าผิด
การดึง URL ใน data pipeline
ดึงโฮสต์เนมหรือเซกเมนต์พาธจาก URL ใน log file หรือข้อมูล analytics เพื่อสร้างรายงานระดับโดเมนหรือกรองปริมาณการเข้าถึงตาม endpoint
การเรียนรู้โครงสร้าง URL
นักศึกษาและนักพัฒนาที่เพิ่งเริ่มเรียนรู้ web protocol สามารถวาง URL จริงและเห็นทันทีว่าตัวคั่นใดกำหนดขอบเขตใด

อ้างอิงส่วนประกอบ URL

ตารางด้านล่างแสดง property ทุกตัวที่ JavaScript URL constructor ส่งคืนเมื่อแยกวิเคราะห์ URL ส่วนประกอบเดียวกันนี้มีอยู่ใน urlparse result ของ Python, struct url.URL ของ Go และ output ของ parse_url ใน PHP แม้ว่าชื่อ property จะแตกต่างกันในแต่ละภาษา

Propertyตัวอย่างคำอธิบาย
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 Standard เทียบกับ RFC 3986

สองข้อกำหนดมาตรฐานกำหนดวิธีแยกวิเคราะห์ URL ทั้งสองเห็นด้วยกับโครงสร้างพื้นฐาน แต่แตกต่างกันใน edge cases — และความแตกต่างนั้นมักเป็นสาเหตุเมื่อเบราว์เซอร์ของคุณจัดการ URL แตกต่างจาก server ของคุณ

WHATWG URL Standard
ใช้โดยเบราว์เซอร์ยุคใหม่ทั้งหมดและ JavaScript URL constructor ยอมรับและทำให้ input ที่ไม่สมบูรณ์เป็นมาตรฐาน: scheme ที่ขาดหาย backslash เป็นตัวคั่นพาธ โฮสต์เนมที่ไม่ใช่ ASCII ผ่าน Punycode กำหนดเป็น living standard ที่ url.spec.whatwg.org
RFC 3986
ข้อกำหนด IETF อย่างเป็นทางการ (2005) เข้มงวดกว่า WHATWG: ปฏิเสธ input บางส่วนที่เบราว์เซอร์ยอมรับ ใช้โดยไลบรารีฝั่ง server หลายตัวรวมถึง net/url ของ Go และ urllib.parse ของ Python กำหนดใน RFC 3986

ในทางปฏิบัติ ความแตกต่างส่วนใหญ่ปรากฏเมื่อแยกวิเคราะห์ URL ที่มีชื่อโดเมนสากล (IDN) scheme ที่ขาดหาย หรืออักขระที่ผิดปกติ WHATWG parser แปลงโฮสต์เนม IDN เป็น Punycode โดยอัตโนมัติ ในขณะที่ RFC 3986 parser ที่เข้มงวดอาจปฏิเสธ หากคุณวาง URL เข้าไปในเครื่องมือนี้และเห็นผลลัพธ์ที่แตกต่างจากที่โค้ด server ของคุณสร้าง ความแตกต่างระหว่าง WHATWG กับ RFC มักเป็นสาเหตุที่เป็นไปได้มากที่สุด

ตัวอย่างโค้ด

ทุกภาษาหลักมี URL parser ในตัว ตัวอย่างด้านล่างแยกวิเคราะห์ URL เดียวกันและดึงส่วนประกอบของมัน สังเกตความแตกต่างเล็กน้อยในการตั้งชื่อข้ามภาษา: Python ใช้ scheme แทน protocol และ Go เปิดเผย RawQuery แทน search

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 ที่ระบุทรัพยากรด้วยชื่อโดยไม่ระบุวิธีดึงข้อมูล ในการพัฒนา web คำศัพท์ทั้งสองมักใช้แทนกันได้เพราะเกือบทุก URI ที่คุณพบคือ URL
URL constructor จัดการ relative URL อย่างไร?
JavaScript URL constructor ต้องการ base URL เมื่อแยกวิเคราะห์ relative path การเรียก new URL('/path?q=1') จะ throw TypeError คุณต้องระบุ base: new URL('/path?q=1', 'https://example.com') urljoin ของ Python และ url.ResolveReference ของ Go ให้บริการจุดประสงค์เดียวกัน เครื่องมือนี้ต้องการ URL สมบูรณ์แบบ absolute ที่มี scheme
จะเกิดอะไรขึ้นเมื่อ URL ไม่มีหมายเลขพอร์ต?
เมื่อไม่ระบุพอร์ต parser จะส่งคืนสตริงว่างสำหรับ property port เบราว์เซอร์จะใช้พอร์ตเริ่มต้นของ scheme: 443 สำหรับ https, 80 สำหรับ http, 21 สำหรับ ftp คุณสามารถเข้าถึงพอร์ตที่มีผลผ่าน property origin หรือ host แต่ฟิลด์ port จะว่างเปล่าเพราะไม่ได้ระบุพอร์ตอย่างชัดเจน
URL สามารถมีอักขระ Unicode ได้ไหม?
ได้ แต่ต้องเข้ารหัสสำหรับการส่งข้อมูล WHATWG URL Standard จัดการนี้โดยอัตโนมัติ: ชื่อโดเมนสากลถูกแปลงเป็น Punycode (คำนำหน้า xn--) และอักขระพาธ/query นอกช่วง ASCII ถูก percent-encoded หากคุณวาง URL ที่มี Unicode เข้าไปในเครื่องมือนี้ คุณจะเห็นเวอร์ชันที่เป็นมาตรฐานและปลอดภัยสำหรับ ASCII ใน output ที่แยกวิเคราะห์แล้ว
ความยาวสูงสุดของ URL คือเท่าไร?
ไม่มีมาตรฐานใดกำหนดความยาวสูงสุดของ URL — RFC 3986 ไม่ได้ระบุเรื่องนี้ ในทางปฏิบัติ เบราว์เซอร์มีข้อจำกัด: Chrome รองรับประมาณ 2MB ในแถบที่อยู่ ในขณะที่ Internet Explorer (รุ่นเก่า) มีข้อจำกัดที่ 2,083 อักขระ web server ส่วนใหญ่ตั้งค่าเริ่มต้นที่ 8KB (Nginx) หรือ 8KB (Apache) สำหรับ request line หากต้องการส่งข้อมูลขนาดใหญ่ ให้ใช้ POST request body แทน query string
ฉันจะแยกวิเคราะห์เฉพาะ query string โดยไม่ต้องใช้ URL เต็มได้อย่างไร?
ใน JavaScript ให้ใช้ new URLSearchParams('page=2&limit=10') เพื่อแยกวิเคราะห์ query string เปล่า ใน Python ให้ใช้ urllib.parse.parse_qs('page=2&limit=10') ทั้งสองส่งคืนพารามิเตอร์เป็นคู่ key-value สิ่งนี้มีประโยชน์เมื่อคุณมี query string แยกต่างหาก เช่น จากการส่งฟอร์มหรือ log entry ที่บันทึกเฉพาะส่วน query
การแยกวิเคราะห์ URL เหมือนกับการถอดรหัส URL ไหม?
ไม่ การแยกวิเคราะห์ URL แบ่ง URL ออกเป็นส่วนประกอบเชิงโครงสร้าง (scheme, host, path, query, fragment) การถอดรหัส URL แปลงอักขระที่ percent-encoded กลับเป็นรูปแบบเดิม (%20 กลายเป็นช่องว่าง, %26 กลายเป็น &) สองการดำเนินการนี้เป็นส่วนเสริมกัน: โดยทั่วไปคุณแยกวิเคราะห์ URL ก่อน แล้วถอดรหัสค่าส่วนประกอบแต่ละตัว การถอดรหัสก่อนแยกวิเคราะห์อาจทำลายโครงสร้าง URL เพราะตัวคั่นที่ถอดรหัสแล้วเช่น & และ = จะถูกตีความผิด

เครื่องมือที่เกี่ยวข้อง