ToolDeck

URL Parser

Urai URL menjadi komponen-komponennya — protokol, host, path, parameter query, hash

Coba contoh

Apa itu Penguraian URL?

Penguraian URL adalah proses memecah Uniform Resource Locator menjadi komponen-komponen individualnya: protokol (scheme), hostname, port, pathname, parameter query, dan pengenal fragmen. Setiap URL mengikuti struktur yang didefinisikan oleh RFC 3986 dan WHATWG URL Standard. Sebuah URL parser membaca string mentah, mengidentifikasi setiap segmen berdasarkan karakter pemisahnya (://, :, /, ?, #, &, =), dan mengembalikannya sebagai bidang-bidang terpisah yang dapat diakses.

Browser melakukan penguraian URL setiap kali Anda mengetik alamat atau mengklik tautan. Konstruktor URL JavaScript, modul urllib.parse Python, dan paket net/url Go semuanya mengimplementasikan parser yang mengikuti aturan struktural yang sama. Mengurai URL adalah kebalikan dari encoding URL: alih-alih mengubah karakter untuk transport yang aman, Anda mengurai URL yang sudah terbentuk menjadi bagian-bagian penyusunnya.

URL tipikal seperti https://api.example.com:8080/v1/users?page=2&limit=10#section mengandung enam komponen yang berbeda. Karakter pemisah — ://, :, /, ?, &, =, dan # — adalah yang membuat penguraian menjadi deterministik: setiap karakter menandai batas dan memungkinkan parser mengekstrak bidang tanpa ambiguitas.

Mengapa Menggunakan URL Parser Online?

Memisahkan URL secara manual dengan mata rentan terhadap kesalahan, terutama ketika string mengandung karakter yang dikodekan, banyak parameter query, atau port non-standar. Alat ini mengurai URL menggunakan algoritma yang sesuai WHATWG — sama seperti yang digunakan browser — dan menampilkan setiap komponen dalam tabel yang jelas dan dapat disalin.

Urai seketika di browser Anda
Tempel URL apa pun dan lihat semua komponen langsung diuraikan. Tidak ada muat ulang halaman, tidak ada panggilan server, tidak perlu menunggu.
🔒
Jaga privasi URL Anda
Penguraian berjalan sepenuhnya di browser Anda menggunakan native URL API. URL yang Anda masukkan tidak pernah meninggalkan mesin Anda.
🔍
Periksa setiap detail
Lihat protokol, hostname, port, pathname, query string, hash, dan setiap parameter query individual beserta nilai yang telah didekode.
📋
Salin komponen individual
Klik tombol salin di sebelah bidang mana pun untuk mengambil nilai yang tepat. Tidak perlu memilih dan memangkas substring secara manual.

Kasus Penggunaan URL Parser

Debugging routing frontend
Periksa apakah segmen path dan fragmen hash sesuai dengan konfigurasi router Anda. Temukan garis miring yang salah tempat atau parameter query yang tidak terduga sebelum menyebabkan error 404.
Validasi endpoint API backend
Verifikasi bahwa URL permintaan yang masuk mengandung hostname, port, dan struktur path yang benar sebelum menulis route handler atau middleware.
Pengujian aturan redirect DevOps
Saat menulis aturan redirect Nginx, Apache, atau CDN, urai URL asal dan tujuan untuk memastikan setiap komponen dipetakan dengan benar.
Verifikasi tautan QA
Urai URL dari laporan pengujian atau tiket bug untuk mengisolasi parameter query atau fragmen mana yang menyebabkan halaman yang salah dimuat.
Ekstraksi URL dalam pipeline data
Ekstrak hostname atau segmen path dari URL dalam file log atau data analitik untuk membuat laporan tingkat domain atau menyaring traffic berdasarkan endpoint.
Mempelajari struktur URL
Mahasiswa dan pengembang yang baru mengenal protokol web dapat menempelkan URL nyata dan langsung melihat pemisah mana yang menandai batas mana.

Referensi Komponen URL

Tabel di bawah menampilkan setiap properti yang dikembalikan oleh konstruktor URL JavaScript saat mengurai URL. Komponen yang sama ada dalam hasil urlparse Python, struct url.URL Go, dan output parse_url PHP, meskipun nama properti berbeda antar bahasa.

PropertiContohDeskripsi
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 vs RFC 3986

Dua spesifikasi mendefinisikan cara URL harus diurai. Keduanya sepakat tentang struktur dasar tetapi berbeda dalam kasus tepi — dan perbedaan itu biasanya menjadi penyebab ketika browser menangani URL secara berbeda dari yang dilakukan server Anda.

WHATWG URL Standard
Digunakan oleh semua browser modern dan konstruktor URL JavaScript. Menerima dan menormalkan input yang kurang tepat: scheme yang hilang, backslash sebagai pemisah path, hostname non-ASCII melalui Punycode. Didefinisikan sebagai living standard di url.spec.whatwg.org.
RFC 3986
Spesifikasi IETF formal (2005). Lebih ketat dari WHATWG: menolak beberapa input yang diterima browser. Digunakan oleh banyak library sisi server termasuk net/url Go dan urllib.parse Python. Didefinisikan dalam RFC 3986.

Dalam praktiknya, sebagian besar perbedaan muncul saat mengurai URL dengan nama domain internasional (IDN), scheme yang hilang, atau karakter yang tidak biasa. Parser WHATWG mengonversi hostname IDN ke Punycode secara otomatis, sementara parser RFC 3986 yang ketat mungkin menolaknya. Jika Anda menempelkan URL ke alat ini dan melihat hasil yang berbeda dari yang dihasilkan kode sisi server Anda, perbedaan WHATWG vs RFC kemungkinan besar adalah penyebabnya.

Contoh Kode

Setiap bahasa utama memiliki URL parser bawaan. Contoh di bawah mengurai URL yang sama dan mengekstrak komponen-komponennya. Perhatikan perbedaan penamaan kecil antar bahasa: Python menggunakan scheme alih-alih protocol, dan Go mengekspos RawQuery alih-alih 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"

Pertanyaan yang Sering Diajukan

Apa perbedaan antara URL dan URI?
URL (Uniform Resource Locator) adalah jenis URI (Uniform Resource Identifier) tertentu yang mencakup baik pengenal maupun mekanisme akses (scheme, seperti https://). Semua URL adalah URI, tetapi tidak semua URI adalah URL. URN seperti urn:isbn:0451450523 adalah URI yang mengidentifikasi sumber daya berdasarkan nama tanpa menentukan cara mengambilnya. Dalam pengembangan web, istilah-istilah ini sering digunakan secara bergantian karena hampir setiap URI yang Anda temui adalah URL.
Bagaimana konstruktor URL menangani URL relatif?
Konstruktor URL JavaScript memerlukan URL dasar saat mengurai path relatif. Memanggil new URL('/path?q=1') akan menghasilkan TypeError. Anda harus menyediakan dasar: new URL('/path?q=1', 'https://example.com'). urljoin Python dan url.ResolveReference Go melayani tujuan yang sama. Alat ini mengharapkan URL absolut yang lengkap dengan scheme.
Apa yang terjadi ketika URL tidak memiliki nomor port?
Ketika port dihilangkan, parser mengembalikan string kosong untuk properti port. Browser mengasumsikan port default untuk scheme: 443 untuk https, 80 untuk http, 21 untuk ftp. Anda dapat mengakses port efektif melalui properti origin atau host, tetapi bidang port itu sendiri tetap kosong karena tidak ada port eksplisit yang ditentukan.
Bisakah URL mengandung karakter Unicode?
Ya, tetapi karakter tersebut harus dikodekan untuk pengiriman. WHATWG URL Standard menangani ini secara otomatis: nama domain internasional dikonversi ke Punycode (awalan xn--), dan karakter path/query di luar rentang ASCII dikodekan persen. Jika Anda menempelkan URL dengan Unicode ke alat ini, Anda akan melihat versi yang dinormalisasi dan aman ASCII dalam output yang diurai.
Berapa panjang maksimum URL?
Tidak ada standar yang mendefinisikan panjang URL maksimum — RFC 3986 tidak membahas topik ini. Dalam praktiknya, browser memberlakukan batas: Chrome mendukung hingga sekitar 2 MB di bilah alamat, sementara Internet Explorer (warisan) memiliki batas 2.083 karakter. Sebagian besar server web secara default menggunakan 8 KB (Nginx) atau 8 KB (Apache) untuk baris permintaan. Jika Anda perlu meneruskan data besar, gunakan isi permintaan POST, bukan query string.
Bagaimana cara mengurai hanya query string tanpa URL lengkap?
Dalam JavaScript, gunakan new URLSearchParams('page=2&limit=10') untuk mengurai query string mentah. Di Python, gunakan urllib.parse.parse_qs('page=2&limit=10'). Keduanya mengembalikan parameter sebagai pasangan kunci-nilai. Ini berguna ketika Anda memiliki query string secara terpisah, misalnya dari pengiriman formulir atau entri log yang hanya menangkap bagian query.
Apakah penguraian URL sama dengan dekode URL?
Tidak. Penguraian URL memisahkan URL menjadi komponen struktural (scheme, host, path, query, fragmen). Dekode URL mengonversi karakter yang dikodekan persen kembali ke bentuk aslinya (%20 menjadi spasi, %26 menjadi &). Kedua operasi ini saling melengkapi: Anda biasanya mengurai URL terlebih dahulu, kemudian mendekode nilai komponen individual. Mendekode sebelum mengurai dapat merusak struktur URL karena pemisah yang terdekode seperti & dan = akan salah diinterpretasikan.