Resolver URL relativa com uma URL base
Transforme um link, caminho, query, fragmento ou referência relativa ao protocolo na URL absoluta exata que o navegador usaria.
Executar grátis
Informe uma URL base absoluta e a referência encontrada em documento, feed, folha de estilos, manifesto ou resposta de API. O resolvedor aplica o padrão a segmentos, barras finais, queries, fragmentos, portas e mudanças de origem, entregando uma URL normalizada sem acessar o destino nem examinar conteúdo remoto. O processo é rápido e determinístico.
Comece pela URL completa que fornece o contexto
Uma referência relativa só tem significado em relação a outra URL. Informe esse contexto em base_url como uma URL absoluta completa, incluindo esquema e host quando o esquema exigir um host. O caminho é tão importante quanto o domínio. Por exemplo, uma base terminada em <code>/docs/page.html</code> trata uma referência simples como <code>image.png</code> como irmã da página, enquanto uma base terminada em <code>/docs/</code> a trata como filha desse diretório. O resolvedor não tenta adivinhar se o caminho representa arquivo ou pasta; ele segue a sintaxe, principalmente a barra final. São aceitas as formas absolutas padrão reconhecidas pela implementação URL do navegador. Um valor como <code>/docs/page.html</code> não serve como base porque não contém esquema absoluto nem contexto de origem. Bases inválidas ou relativas geram erro de entrada, em vez de uma resposta que apenas parece correta. Essa rigidez revela problemas antes que links resolvidos cheguem a um crawler, uma importação, uma regra de redirecionamento ou um conjunto de dados persistido.
Entenda como cada referência altera a base
O campo relative_reference aceita mais do que um nome de arquivo. Uma barra inicial substitui o caminho base, mas mantém esquema e autoridade. Duas barras iniciais criam uma referência de rede, permitindo trocar o host e herdar o esquema. Segmentos como <code>../</code> sobem níveis, enquanto <code>./</code> permanece no nível atual; a normalização remove esses segmentos de navegação da URL final. Uma referência iniciada por <code>?</code> preserva o caminho e substitui a query. Quando começa por <code>#</code>, preserva caminho e query e altera o fragmento. Uma referência totalmente absoluta substitui a base, conforme determina o padrão. Esta capacidade rejeita referências vazias para não confundir um campo ausente por engano com a reutilização intencional da base. Caracteres codificados por porcentagem continuam codificados conforme as regras de serialização, enquanto hosts, portas padrão e outros componentes podem ser normalizados para a forma canônica produzida pelo analisador padrão.
Use o resultado serializado sem fazer uma requisição
O resultado contém absolute_url, a URL normalizada e serializada depois da resolução. Nenhuma consulta DNS, requisição HTTP, verificação de disponibilidade, descarga ou sequência de redirecionamentos é executada. Essa separação ajuda quando você precisa de uma transformação determinística, e não de um teste do site em tempo real: as mesmas duas entradas sempre produzem a mesma saída, mesmo que o host não exista ou o recurso seja privado. Use o resultado para normalizar links extraídos de HTML, preparar filas de crawling, expandir referências em feeds, validar fixtures, montar entradas de sitemap ou comparar URLs de maneira uniforme antes da deduplicação. A resolução sintática não comprova que o destino seja seguro, acessível, público ou autorizado. Se os valores vierem de usuários não confiáveis, aplique as políticas de esquema, host e acesso à rede do seu aplicativo antes de buscar a URL devolvida. A API e o executor do navegador usam o mesmo algoritmo puro. Cada requisição de API custa US$ 0,002; a execução local nesta página é gratuita.
Casos de uso
Expandir links extraídos de uma página
Converta valores relativos de href e src em URLs absolutas usando a URL do documento de origem.
Normalizar itens de uma fila de crawling
Resolva segmentos de ponto, caminhos desde a raiz, queries e fragmentos antes do crawling ou da deduplicação.
Testar rotas e fixtures de URL
Gere URLs esperadas determinísticas para testes sem contatar hosts nem depender do estado da rede.
Perguntas frequentes
O que uma barra final muda na URL base?
Ela determina se o último segmento é tratado como diretório. Sem a barra, um caminho relativo simples substitui esse segmento; com ela, o caminho é acrescentado dentro do diretório.
A referência relativa pode ser uma URL absoluta?
Sim. A resolução padrão retorna essa URL absoluta independentemente da base, aplicando a serialização normal.
A ferramenta verifica se a URL resolvida existe?
Não. Ela não faz requisição de rede, consulta DNS, verificação de redirecionamento nem teste de disponibilidade.
Referências contendo somente query ou fragmento são aceitas?
Sim. Uma referência iniciada por ? substitui a query; uma iniciada por # altera o fragmento conforme as regras padrão.
O que acontece quando a URL base é relativa?
A requisição falha com erro de entrada inválida, pois uma base relativa não fornece contexto suficiente para gerar uma URL absoluta.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/web/absolute-url-resolve \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"base_url":"https://example.com/docs/guides/start.html","relative_reference":"../images/logo.svg?theme=dark#mark"}'const res = await fetch("https://api.kit.forhosting.com/web/absolute-url-resolve", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"base_url": "https://example.com/docs/guides/start.html",
"relative_reference": "../images/logo.svg?theme=dark#mark"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/absolute-url-resolve",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"base_url": "https://example.com/docs/guides/start.html",
"relative_reference": "../images/logo.svg?theme=dark#mark"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/absolute-url-resolve", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"base_url":"https://example.com/docs/guides/start.html","relative_reference":"../images/logo.svg?theme=dark#mark"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"base_url":"https://example.com/docs/guides/start.html","relative_reference":"../images/logo.svg?theme=dark#mark"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/absolute-url-resolve", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"base_url": "https://example.com/docs/guides/start.html",
"relative_reference": "../images/logo.svg?theme=dark#mark"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.absolute_url_resolve",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
timeout_sec | 30 |
max_crawl_pages | 25 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |