Разрешение абсолютного пути от относительного пути

Я делаю веб-сканер и пытаюсь найти способ найти абсолютный путь из относительного пути.
Я взял 2 тестовых сайта. Один в ROR и 1 сделан с использованием Pyro CMS.

В последнем я нашел теги href со ссылкой «index.php». Итак, если я сейчас ползу на http://example.com/xyz, тогда мой сканер добавит и сделает это http://example.com/xyz/index.php, Но проблема в том, что я должен добавить корень вместо того, т.е. http://example.com/index.php, Так что если я ползу http://example.com/xyz/index.phpЯ найду еще один «index.php», который будет добавлен снова.

Если в ROR относительный путь начинается с ‘/’, я мог бы легко знать, что это корневой сайт.

Я могу справиться со случаем index.php, но может быть так много правил, о которых мне нужно позаботиться, если я начну делать это вручную. Я уверен, что есть более простой способ сделать это.

2

Решение

In Go, пакет path твой друг.

Вы можете получить каталог или папку по пути с path.Dir(), например

p := "/xyz/index.php"dir := path.Dir(p)
fmt.Println("dir:", dir) // Output: "/xyz"

Если вы найдете ссылку с корневым путем (начинается с косой черты), вы можете использовать ее как есть.

Если это относительно, вы можете присоединиться к нему с dir над использованием path.Join(). Join() также будет «чистить» URL:

p2 := path.Join(dir, "index.php")
fmt.Println("p2:", p2)
p3 := path.Join(dir, "./index.php")
fmt.Println("p3:", p3)
p4 := path.Join(dir, "../index.php")
fmt.Println("p4:", p4)

Выход:

p2: /xyz/index.php
p3: /xyz/index.php
p4: /index.php

«Очистка» задач, выполняемых path.Join() сделаны path.Clean() который вы можете вручную вызвать на любом пути, конечно. Они есть:

  1. Замените несколько слэшей одним слэшем.
  2. Устранить каждого . элемент имени пути (текущий каталог).
  3. Устранить каждый внутренний .. элемент имени пути (родительский каталог) вместе с.. элемент, который предшествует этому.
  4. Устранить .. элементы, начинающие укорененный путь: то есть заменить "/.." от "/" в начале пути.

И если у вас есть «полный» URL (со схемой, хостом и т. Д.), Вы можете использовать url.Parse() функция для получения url.URL значение из необработанной строки URL, которая маркирует URL для вас, поэтому вы можете получить путь следующим образом:

uraw := "http://example.com/xyz/index.php"u, err := url.Parse(uraw)
if err != nil {
fmt.Println("Invalid url:", err)
}
fmt.Println("Path:", u.Path)

Выход:

Path: /xyz/index.php

Попробуйте все примеры на Go Playground.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]