Я делаю веб-сканер и пытаюсь найти способ найти абсолютный путь из относительного пути.
Я взял 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, но может быть так много правил, о которых мне нужно позаботиться, если я начну делать это вручную. Я уверен, что есть более простой способ сделать это.
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()
который вы можете вручную вызвать на любом пути, конечно. Они есть:
- Замените несколько слэшей одним слэшем.
- Устранить каждого
.
элемент имени пути (текущий каталог).- Устранить каждый внутренний
..
элемент имени пути (родительский каталог) вместе с..
элемент, который предшествует этому.- Устранить
..
элементы, начинающие укорененный путь: то есть заменить"/.."
от"/"
в начале пути.
И если у вас есть «полный» 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.
Других решений пока нет …