Как получить базовый URL-адрес с помощью jquery или javascript?


163

В joomla php я могу использовать его $this->baseurlдля получения базового пути, но я хотел получить базовый путь в jquery.

Базовый путь может быть любым из следующих примеров:

http://www.example.com/
http://localhost/example
http://www.example.com/sub/example

Также exampleможет измениться.



@Mritunjay Я уже видел это, но в моем случае базовый путь отличается, так как я хотел получить базовый путь, как в php, который мы делаем в joomla
Навин Раунияр

Итак, ни один из ответов не решил вашу проблему?
Artjom B.

выберите ответ, пожалуйста?
aljabear

Ответы:


185

Это поможет вам ...

var getUrl = window.location;
var baseUrl = getUrl .protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];

Да, это работает! http://localhost/myapp/what/ever/sub/folder-> getBaseUrl -> http://localhost/myapp:-)
vee

3
Это не будет работать во всех случаях, на что указывает как-то недооцененный ответ @Artjom B. Например, когда сайт тестируется в локальной сети (и домен заменяется на IP + локальный путь), базовый URL-адрес может быть чем-то вроде 192.168.0.23/~sites/site/html/вместо site.dev. Получение полного пути с помощью Javascript тоже не вариант, потому что сайт может иметь любое количество виртуальных подкаталогов.
конечно

лучший ответ ... отлично работает для меня в ionic и react.js
Бетини О. Хелено

144

Я думаю, тебе подойдет

var base_url = window.location.origin;

var host = window.location.host;

var pathArray = window.location.pathname.split( '/' );

7
Хорошо, коротко и мило, спасибо. window.location.origin
TetraDev

1
это должен быть предпочтительный ответ, поскольку он короткий, лаконичный и работает нормально.
Грегор

window.location.origin не определен в ie9
jnoreiga

2
@jnoreiga Кто все еще использует ie9 ツ
Александр Добрикур,

2
Я бы хотел, чтобы все было так просто @AlexandreDaubricourt
jnoreiga


24

Это очень старый вопрос, но вот подходы, которые я лично использую ...

Получить стандартный / базовый URL

Как уже было сказано многими, это работает в большинстве ситуаций.

var url = window.location.origin;


Получить абсолютный базовый URL

Однако этот простой подход можно использовать для удаления любых номеров портов.

var url = "http://" + location.host.split(":")[0];

Изменить: чтобы решить проблему, высказанную Джейсоном Райсом , для автоматической вставки правильного типа протокола можно использовать следующее ...

var url = window.location.protocol + "//" + location.host.split(":")[0];


Установить базовый URL

В качестве бонуса - базовый URL-адрес может быть переопределен глобально.

document.head.innerHTML = document.head.innerHTML + "<base href='" + url + "' />";

1
Если ваш протокол не является чем-то другим, кроме http, например https (тогда установка протокола URL-адреса на «http: //» представит некоторые действительно странные ошибки в зависимости от того, как вы хотите использовать URL-адрес).
Джейсон Райс


13

Это невозможно из javascript, потому что это свойство на стороне сервера. Javascript на клиенте не может знать, где установлена ​​joomla. Лучший вариант - как-то включить значение $this->baseurlв javascript страницы, а затем использовать это значение ( phpBaseUrl).

Затем вы можете создать URL-адрес следующим образом:

var loc = window.location;
var baseUrl = loc.protocol + "//" + loc.hostname + (loc.port? ":"+loc.port : "") + "/" + phpBaseUrl;

1
Обратите внимание , что loc.hostимеет порт для URL , как http://localhost:8082/этот метод будет производить http://localhost:8082:8082/, window.location.hostnameследует использовать вместо этого.
Тибериу С.

@TiberiuC. Спасибо, добавил.
Artjom B.

9

Некоторое время назад была такая же проблема, моя проблема заключалась в том, что мне просто нужен базовый URL. Здесь есть много подробных опций, но чтобы обойти это, просто используйте window.locationобъект. На самом деле введите это в консоли браузера и нажмите Enter, чтобы выбрать там свои параметры. В моем случае это было просто:

window.location.origin

8
var getUrl = window.location;
var baseurl = getUrl.origin; //or
var baseurl =  getUrl.origin + '/' +getUrl.pathname.split('/')[1]; 

Но нельзя сказать, что baseurl () CodeIgniter (или php joomla) вернет то же значение, поскольку можно изменить baseurl в файле .htaccess этих фреймворков.

Например :

Если у вас есть такой файл .htaccess на вашем локальном хосте:

RewriteEngine on
RewriteBase /CodeIgniter/
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

$ This-> baseurl () вернет http: // localhost / CodeIgniter /



5

Я столкнулся с этой потребностью в нескольких проектах Joomla. Самый простой способ, который я нашел, - это добавить в мой шаблон скрытое поле ввода:

<input type="hidden" id="baseurl" name="baseurl" value="<?php echo $this->baseurl; ?>" />

Когда мне нужно значение в JavaScript:

var baseurl = document.getElementById('baseurl').value;

Не так сложно, как использование чистого JavaScript, но просто и выполняет свою работу.


4

Вы можете легко получить это с помощью:

var currentUrl = window.location.href;

или, если вам нужен исходный URL, используйте:

var originalUrl = window.location.origin;

3

Я бы порекомендовал всем создать базовый тег HTML в процессе разработки, а затем динамически назначать href, поэтому в процессе производства, какой бы хост ни использовал клиент, он автоматически добавлялся к нему:

<html>
 <title>Some page title</titile>
  <script type="text/javascript">
    var head  = document.getElementsByTagName('head')[0];
    var base = document.createElement("base");
    base.href = window.document.location.origin;
    head.appendChild(base);
  </script>
 </head>
 ...

Итак, если вы находитесь в localhot: 8080, вы получите доступ к каждому связанному или указанному файлу из базы, например: http://localhost:8080/some/path/file.html если вы находитесь на www.example.com, это будетhttp://www.example.com/some/path/file.html

Также обратите внимание, что для каждого местоположения, в котором вы находитесь, вы не должны использовать ссылки, такие как globs, в hrefs, например: Родительское местоположение http://localhost:8080/не вызывает http://localhost:8080/some/path/.

Сделайте вид, что вы ссылаетесь на все гиперссылки как на полные предложения без базового URL.


3

Формат: имя хоста / путь / поиск

Итак, URL-адрес:

var url = window.location.hostname + window.location.pathname + window.location.hash

Для вашего случая

window.location.hostname = "stackoverflow.com"
window.location.pathname ="/questions/25203124/how-to-get-base-url-with-jquery-or-javascript"
window.location.hash = ""

Итак, в основном baseurl = hostname = window.location.hostname


3

Я удивлен, что ни один из ответов не учитывает базовый URL-адрес, если он был установлен в <base>теге. Все текущие ответы пытаются получить имя хоста или имя сервера или первую часть адреса. Это полная логика, которая также учитывает <base>тег (который может относиться к другому домену или протоколу):

function getBaseURL(){
  var elem=document.getElementsByTagName("base")[0];
  if (typeof(elem) != 'undefined' && elem != null){
     return elem.href;
  }
  return window.location.origin;
}

Формат JQuery:

function getBaseURL(){
  if ($("base").length){
     return $("base").attr("href");
  }
  return window.location.origin;
}

Не вдаваясь в приведенную выше логику, сокращенное решение, которое учитывает как <base>тег, так и window.location.origin:

Js:

var a=document.createElement("a");
a.href=".";
var baseURL= a.href;

JQuery:

var baseURL= $('<a href=".">')[0].href

Последнее замечание: для локального файла на вашем компьютере (не на хосте) window.location.originвозвращается file://только метод сортировки, но приведенное выше решение sorthand возвращает полный правильный путь.


1
Это не лучший способ. Также см. Ответ @ DaniilSamoylov, который включает <base>элемент.
Брэд

baseURI возвращает базовый URL-адрес узла, поэтому в этом случае он возвращает базовый путь + имя документа. вам потребуются дополнительные коды, чтобы удалить имя документа из этого URL. @Brad
Али Шейхпур

Это решение никак не вернуть правильный базовый URL , когда в корневом каталоге веб - страницы находится в подкаталоге (например , example.com/appRoot ). Он работает только в том случае, если корневой каталог веб-страницы находится непосредственно в корне веб-хоста.
Джон Рейнджер

2
window.location.origin+"/"+window.location.pathname.split('/')[1]+"/"+page+"/"+page+"_list.jsp"

почти такой же, как ответ Жениша, но немного короче.


2

Я был на той же сцене, и это решение работает для меня

В представлении

<?php
    $document = JFactory::getDocument();

    $document->addScriptDeclaration('var base = \''.JURI::base().'\'');
    $document->addScript('components/com_name/js/filter.js');
?>

В js-файле вы baseполучаете доступ к переменной, например, в своем сценарии:

console.log(base) // will print
// http://www.example.com/
// http://localhost/example
// http://www.example.com/sub/example

Не помню, откуда беру эту информацию, чтобы отдать должное, если найду, то отредактирую ответ



1

Легко

$('<img src=>')[0].src

Создает img с пустым src-name, заставляет браузер вычислять базовый URL-адрес самостоятельно, независимо от того, есть ли у вас /index.htmlили что-то еще.


Это кажется самым элегантным решением из всех и единственным, которое не дублирует логику браузера, что приятно. Интересно, насколько это портативно. Есть ли в спецификациях HTML что-нибудь, что могло бы предположить, что это гарантированно работает во всех браузерах?
Matthijs Kooijman

@MatthijsKooijman Зависит от интерпретации спецификаций html. Если вы говорите, что имя файла длиной 0 является допустимым именем ресурса ... оно соответствует всем браузерам.
Grim

Узнайте, как устроены браузеры. У вас есть пара программистов, которые (косвенно) хотят создать браузер. Их первый источник - это html-спецификации. Они читают спецификации, и это один из вопросов, которые им действительно нравится решать. Как вы думаете, как они (все) решатся на эти обстоятельства?
Grim

1
Это должен быть выбранный ответ.
Norcal Johnny


1

Вот что-то быстрое, что также работает с file://URL-адресами.

Я придумал этот однострочник:

[((1!=location.href.split(location.href.split("/").pop())[0].length?location.href.split(location.href.split("/").pop())[0]:(location.protocol,location.protocol+"//" + location.host+"/"))).replace(location.protocol+"//"+location.protocol+"//"+location.protocol+"://")]

0

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

<head>
  <base href="http://www.example.com/">
</head>

Обычно я создаю ссылку через PHP.


0

На случай, если кто-то захочет увидеть, как это разбито на очень надежную функцию

    function getBaseURL() {
        var loc = window.location;
        var baseURL = loc.protocol + "//" + loc.hostname;
        if (typeof loc.port !== "undefined" && loc.port !== "") baseURL += ":" + loc.port;
        // strip leading /
        var pathname = loc.pathname;
        if (pathname.length > 0 && pathname.substr(0,1) === "/") pathname = pathname.substr(1, pathname.length - 1);
        var pathParts = pathname.split("/");
        if (pathParts.length > 0) {
            for (var i = 0; i < pathParts.length; i++) {
                if (pathParts[i] !== "") baseURL += "/" + pathParts[i];
            }
        }
        return baseURL;
    }

Это просто дает весь URL-адрес. Не базовый URL.
Сэм

действительно, не уверен, к чему я клоню. Я давно переключился на установку этого кода на стороне сервера
nuander


-4

Поместите это в свой заголовок, чтобы он был доступен, когда вам это нужно.

var base_url = "<?php echo base_url();?>";

Вы получите http://localhost:81/your-path-fileили http://localhost/your-path-file.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.