JavaScript: Завершение относительного URL для собственного сайта - PullRequest
1 голос
/ 07 февраля 2010

Есть ли лучший способ написать эту процедуру, которая завершает относительный URL для моего сайта?

if (!url.startsWith('http')) {
     url = + location.protocol + '//' + location.host + (url.startsWith('/') ? '' : '/') + url 
});

Ответы [ 3 ]

0 голосов
/ 07 февраля 2010

Возможно, вы захотите, чтобы серверная сторона предоставляла базовый URL для вашего веб-сайта. Причина в том, что обычно проще получить доступ к базовому URL сайта на сервере. Все, что вам нужно сделать, это иметь скрипт / действие на стороне сервера, которое генерирует скрипт, который выглядит так:

var siteBaseUrl = 'http://example.com/';

// use string replacement to remove any leading slash on the incoming url.
function makeAbsoluteUrl( url )
{
    if (!url.match(/^http/)) {
        url = siteBaseUrl + url.replace(/^\//,'');
    })
    return url;
}

Вы можете ссылаться на него на своей веб-странице как:

<script type="text/javscript" src="/scripts/baseUrl.php"> // adjust for platform
</script>

И используйте его как

url = makeAbsoluteUrl( url );
0 голосов
/ 07 февраля 2010

я думаю, что следующее будет правильно обрабатывать все возможные URL

lstrip = function(str, prefix) {
    return str.indexOf(prefix) == 0 ?
        str.substring(prefix.length) :
        str;
}

completeURL = function(url, host) {
  url = lstrip(url, "http://");
  url = lstrip(url, host);
  url = lstrip(url, "/");
  return "http://" + host + "/" + url
}

//test
urls = [
"http://host.com/foo/bar",
"host.com/foo/bar",
"/foo/bar",
"foo/bar",
"foo.php",
"host.com",
""
]

for(var n = 0; n < urls.length; n++)
   console.log(completeURL(urls[n], "host.com"))
0 голосов
/ 07 февраля 2010

На первом может быть, например, ftp: //

Вы должны проверить, есть ли // в URL.

И вместо «location.host» вы должны использовать «location» с обрезанным последним словом после последнего: «/». Я имею в виду www.page.com/file.html -> www.page.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...