Как получить базовый URL с PHP?
Я использую XAMPP для Windows Vista. В моем развитии у меня есть http://127.0.0.1/test_website/
.
Как мне получить http://127.0.0.1/test_website/
с PHP?
Я пробовал что-то подобное, но никто из них не работал.
echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.
Ответы
Ответ 1
Попробуйте следующее:
<?php echo "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; ?>
Подробнее о $_SERVER
Предопределенная переменная
Если вы планируете использовать https, вы можете использовать это:
function url(){
return sprintf(
"%s://%s%s",
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
$_SERVER['SERVER_NAME'],
$_SERVER['REQUEST_URI']
);
}
echo url();
#=> http://127.0.0.1/foo
Per этот ответ, убедитесь, что вы правильно настроили свой Apache, чтобы вы могли спокойно зависеть от SERVER_NAME
.
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
ПРИМЕЧАНИЕ. Если вы зависите от ключа HTTP_HOST
(который содержит вход пользователя), вам все равно нужно выполнить некоторую очистку, удалить пробелы, запятые, возврат каретки, все, что не является действительный символ для домена. Проверьте, например, функции php builtin parse_url.
Ответ 2
Функция, настроенная для выполнения без предупреждений:
function url(){
if(isset($_SERVER['HTTPS'])){
$protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off") ? "https" : "http";
}
else{
$protocol = 'http';
}
return $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
Ответ 3
Fun 'base_url' snippet!
if (!function_exists('base_url')) {
function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
if (isset($_SERVER['HTTP_HOST'])) {
$http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
$hostname = $_SERVER['HTTP_HOST'];
$dir = str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
$core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
$core = $core[0];
$tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
$end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
$base_url = sprintf( $tmplt, $http, $hostname, $end );
}
else $base_url = 'http://localhost/';
if ($parse) {
$base_url = parse_url($base_url);
if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
}
return $base_url;
}
}
Использовать так же просто, как:
// url like: http://stackoverflow.com/questions/2820723/how-to-get-base-url-with-php
echo base_url(); // will produce something like: http://stackoverflow.com/questions/2820723/
echo base_url(TRUE); // will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); // will produce something like: http://stackoverflow.com/questions/
// and finally
echo base_url(NULL, NULL, TRUE);
// will produce something like:
// array(3) {
// ["scheme"]=>
// string(4) "http"
// ["host"]=>
// string(12) "stackoverflow.com"
// ["path"]=>
// string(35) "/questions/2820723/"
// }
Ответ 4
$modifyUrl = parse_url($url);
print_r($modifyUrl)
Его просто использовать
Выход:
Array
(
[scheme] => http
[host] => aaa.bbb.com
[path] => /
)
Ответ 5
$base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';
Использование:
print "<script src='{$base_url}js/jquery.min.js'/>";
Ответ 6
Я думаю, что superglobal $_SERVER
имеет информацию, которую вы ищете. Это может быть примерно так:
echo $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']
Вы можете увидеть соответствующую документацию PHP здесь.
Ответ 7
Следующий код уменьшит проблему, чтобы проверить протокол.
$ _SERVER ['APP_URL'] отобразит имя домена с протоколом
$_ SERVER ['APP_URL'] вернет протокол://domain (например: - http://localhost)
$_ SERVER ['REQUEST_URI'] для оставшихся частей URL-адреса, например /directory/subdirectory/something/else
$url = $_SERVER['APP_URL'].$_SERVER['REQUEST_URI'];
Результат будет таким:
http://localhost/directory/subdirectory/something/else
Ответ 8
Вы можете сделать это так, но извините, мой английский недостаточно хорош.
Во-первых, получите домашний базовый URL с помощью этого простого кода.
Я проверил этот код на своем локальном сервере и общедоступном, и результат хороший.
<?php
function home_base_url(){
// first get http protocol if http or https
$base_url = (isset($_SERVER['HTTPS']) &&
$_SERVER['HTTPS']!='off') ? 'https://' : 'http://';
// get default website root directory
$tmpURL = dirname(__FILE__);
// when use dirname(__FILE__) will return value like this "C:\xampp\htdocs\my_website",
//convert value to http url use string replace,
// replace any backslashes to slash in this case use chr value "92"
$tmpURL = str_replace(chr(92),'/',$tmpURL);
// now replace any same string in $tmpURL value to null or ''
// and will return value like /localhost/my_website/ or just /my_website/
$tmpURL = str_replace($_SERVER['DOCUMENT_ROOT'],'',$tmpURL);
// delete any slash character in first and last of value
$tmpURL = ltrim($tmpURL,'/');
$tmpURL = rtrim($tmpURL, '/');
// check again if we find any slash string in value then we can assume its local machine
if (strpos($tmpURL,'/')){
// explode that value and take only first value
$tmpURL = explode('/',$tmpURL);
$tmpURL = $tmpURL[0];
}
// now last steps
// assign protocol in first value
if ($tmpURL !== $_SERVER['HTTP_HOST'])
// if protocol its http then like this
$base_url .= $_SERVER['HTTP_HOST'].'/'.$tmpURL.'/';
else
// else if protocol is https
$base_url .= $tmpURL.'/';
// give return value
return $base_url;
}
?>
// and test it
echo home_base_url();
вывод будет такой:
local machine : http://localhost/my_website/ or https://myhost/my_website
public : http://www.my_website.com/ or https://www.my_website.com/
используйте функцию home_base_url
на index.php
вашего сайта и определите ее
а затем вы можете использовать эту функцию для загрузки скриптов, CSS и контента через URL-адрес, как
<?php
echo '<script type="text/javascript" src="'.home_base_url().'js/script.js"></script>'."\n";
?>
создаст вывод как это:
<script type="text/javascript" src="http://www.my_website.com/js/script.js"></script>
и если этот скрипт работает нормально ,!
Ответ 9
Я нашел это на
http://webcheatsheet.com/php/get_current_page_url.php
Добавьте следующий код на страницу:
<?php
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
?>
Теперь вы можете получить текущий URL страницы с помощью строки:
<?php
echo curPageURL();
?>
Иногда требуется получить только имя страницы. В следующем примере показано, как это сделать:
<?php
function curPageName() {
return substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
}
echo "The current page name is ".curPageName();
?>
Ответ 10
Простой и легкий трюк:
$host = $_SERVER['HTTP_HOST'];
$host_upper = strtoupper($host);
$path = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$baseurl = "http://" . $host . $path . "/";
URL-адрес выглядит следующим образом: http://example.com/folder/
Ответ 11
Попробуйте это. Это работает для меня.
/*url.php file*/
trait URL {
private $url = '';
private $current_url = '';
public $get = '';
function __construct()
{
$this->url = $_SERVER['SERVER_NAME'];
$this->current_url = $_SERVER['REQUEST_URI'];
$clean_server = str_replace('', $this->url, $this->current_url);
$clean_server = explode('/', $clean_server);
$this->get = array('base_url' => "/".$clean_server[1]);
}
}
Используйте это:
<?php
/*
Test file
Tested for links:
http://localhost/index.php
http://localhost/
http://localhost/index.php/
http://localhost/url/index.php
http://localhost/url/index.php/
http://localhost/url/ab
http://localhost/url/ab/c
*/
require_once 'sys/url.php';
class Home
{
use URL;
}
$h = new Home();
?>
<a href="<?=$h->get['base_url']?>">Base</a>
Ответ 12
Здесь я только что собрал это для меня. Он вернет массив с 2 элементами. Первый элемент - это все до? а второй - массив, содержащий все переменные строки запроса в ассоциативном массиве.
function disectURL()
{
$arr = array();
$a = explode('?',sprintf(
"%s://%s%s",
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
$_SERVER['SERVER_NAME'],
$_SERVER['REQUEST_URI']
));
$arr['base_url'] = $a[0];
$arr['query_string'] = [];
if(sizeof($a) == 2)
{
$b = explode('&', $a[1]);
$qs = array();
foreach ($b as $c)
{
$d = explode('=', $c);
$qs[$d[0]] = $d[1];
}
$arr['query_string'] = (count($qs)) ? $qs : '';
}
return $arr;
}
Примечание. Это расширение ответа, предоставленного maček выше. (Кредит, в котором должен быть предоставлен кредит.)
Ответ 13
Отредактировано в @user3832931, чтобы включить серверный порт.
для формирования URL-адресов, таких как https://localhost:8000/folder/ '
$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';
Ответ 14
Попробуйте следующий код:
$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
$config['base_url'] .= "://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
echo $config['base_url'];
Ответ 15
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";
$url = $http . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'];
Ответ 16
$some_variable = substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);
и вы получаете что-то вроде
lalala/tralala/something/
Ответ 17
function server_url(){
$server ="";
if(isset($_SERVER['SERVER_NAME'])){
$server = sprintf("%s://%s%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME'], '/');
}
else{
$server = sprintf("%s://%s%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_ADDR'], '/');
}
print $server;
}
Ответ 18
Попробуйте использовать: $_SERVER['SERVER_NAME'];
Я использовал его, чтобы отразить базовый url моего сайта, чтобы связать мой css.
<link href="//<?php echo $_SERVER['SERVER_NAME']; ?>/assets/css/your-stylesheet.css" rel="stylesheet" type="text/css">
Надеюсь, это поможет!
Ответ 19
У меня был тот же вопрос, что и OP, но, возможно, другое требование. Я создал эту функцию...
/**
* Get the base URL of the current page. For example, if the current page URL is
* "https://example.com/dir/example.php?whatever" this function will return
* "https://example.com/dir/" .
*
* @return string The base URL of the current page.
*/
function get_base_url() {
$protocol = filter_input(INPUT_SERVER, 'HTTPS');
if (empty($protocol)) {
$protocol = "http";
}
$host = filter_input(INPUT_SERVER, 'HTTP_HOST');
$request_uri_full = filter_input(INPUT_SERVER, 'REQUEST_URI');
$last_slash_pos = strrpos($request_uri_full, "/");
if ($last_slash_pos === FALSE) {
$request_uri_sub = $request_uri_full;
}
else {
$request_uri_sub = substr($request_uri_full, 0, $last_slash_pos + 1);
}
return $protocol . "://" . $host . $request_uri_sub;
}
... который, кстати, я использую, чтобы помочь создать абсолютные URL-адреса, которые должны использоваться для перенаправления.
Ответ 20
Просто проверьте и получите результат.
// output: /myproject/index.php
$currentPath = $_SERVER['PHP_SELF'];
// output: Array ( [dirname] => /myproject [basename] => index.php [extension] => php [filename] => index )
$pathInfo = pathinfo($currentPath);
// output: localhost
$hostName = $_SERVER['HTTP_HOST'];
// output: http://
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))=='https://'?'https://':'http://';
// return: http://localhost/myproject/
echo $protocol.$hostName.$pathInfo['dirname']."/";
Ответ 21
В моем случае мне понадобился базовый URL-адрес, аналогичный RewriteBase
содержится в файле .htaccess
.
К сожалению, просто получить RewriteBase
из файла .htaccess
невозможно с PHP. Но можно установить переменную окружения в файле .htaccess, а затем извлечь эту переменную в PHP. Просто проверьте эти биты кода:
.htaccess
SetEnv BASE_PATH /
index.php
Теперь я использую это в базовом теге шаблона (в разделе заголовка страницы):
<base href="<?php echo ! empty( getenv( 'BASE_PATH' ) ) ? getenv( 'BASE_PATH' ) : '/'; ?>"/>
Исходя из среды, базовый URL будет правильным. Я использую/для моего местоположения и производственной площадки. Но /foldername/
для постановочной среды. Все они имели свой собственный .htaccess
потому что RewriteBase был другим. Так что это решение работает для меня.