Как безопасно получить полный URL родительского каталога текущей страницы PHP
Я использую:
$domain = $_SERVER['HTTP_HOST'];
$path = $_SERVER['SCRIPT_NAME'];
$themeurl = $domain . $path;
но это, конечно, дает полный URL. Вместо Этого Я!--9-->нужен полный URL минус текущий файл и один каталог и минус косая черта.
поэтому независимо от того, какой домен URL браузера, например, localhost, https://, http:// и т. д., Полный реальный (в обход любого мод перезаписывает) URL-путь родительского каталога задается без конечной косой черты.
как это сделать? Безопасно так нет XSS, как я думаю (от чтение) использование чего-либо, кроме "SCRIPT_NAME", имеет такой риск.. не уверен, хотя ОФК.. просто читал тонну, пытаясь понять это.
примеры: если дано:
https://stackoverflow.com/questions/somequestions/index.php
нужно:
https://stackoverflow.com/questions
без закрывающего слеша.
а также должен работать, скажем:
http://localhost/GetSimple/admin/load.php
и
http://localhost/GetSimple
что я и пытаюсь сделать.
спасибо вы.
Edit: Вот рабочее решение я использовал:
$url = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= htmlspecialchars($_SERVER['REQUEST_URI']);
$themeurl = dirname(dirname($url)) . "/theme";
он отлично работает.
7 ответов
Это легко - с помощью функции dirname
в два раза :)
echo dirname(dirname('https://stackoverflow.com/questions/somequestions/index.php'));
Также обратите внимание на комментарий @Sid. Когда вам нужен полный URI для текущего скрипта, с протоколом и сервером использовать что-то вроде этого:
$url = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= $_SERVER['REQUEST_URI'];
echo dirname(dirname($url));
у меня более простой синтаксис для получения родительских адресов с портом и url давайте попробуем мой код
dirname($_SERVER['PHP_SELF'])
С помощью этого кода Вы можете получить прямой родитель adres если вы хотите 2x откатить каталог, вы можете зацикливаться
dirname(dirname($_SERVER['PHP_SELF']))
dirname-это fungtion для получения родительского addrest web и $_SERVER ['PHP_SELF'] может показывать текущий addres web.
thakyou сэр https://stackoverflow.com/users/171318/hek2mgl
этот пример работает с портами
function full_url($s)
{
$ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
$sp = strtolower($s['SERVER_PROTOCOL']);
$protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
$port = $s['SERVER_PORT'];
$port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
$host = isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : $s['SERVER_NAME'];
return $protocol . '://' . $host . $port . $s['REQUEST_URI'];
}
$themeurl = dirname(dirname(full_url($_SERVER))).'/theme';
echo '<a href="'.htmlspecialchars($themeurl,ENT_QUOTES,'UTF-8').'">Theme URL</a>';
я не предлагаю использовать dirname()
как для каталогов, а не для URIs. Примеры:
-
dirname("http://example.com/foo/index.php")
возвращаетhttp://example.com/foo
-
dirname("http://example.com/foo/")
возвращаетhttp://example.com
-
dirname("http://example.com/")
возвращаетhttp:
-
dirname("http://example.com")
возвращаетhttp:
так что вы должны быть очень carful который $_SERVER
var вы используете, и, конечно, он работает только для этой конкретной проблемы. Гораздо лучшим общим решением было бы использовать currentdir() на каком основании вы можете использовать это, чтобы получить родительский каталог:
function parentdir($url) {
// note: parent of "/" is "/" and parent of "http://example.com" is "http://example.com/"
// remove filename and query
$url = currentdir($url);
// get parent
$len = strlen($url);
return currentdir(substr($url, 0, $len && $url[ $len - 1 ] == '/' ? -1 : $len));
}
примеры:
-
parentdir("http://example.com/foo/bar/index.php")
возвращаетhttp://example.com/foo/
-
parentdir("http://example.com/foo/index.php")
возвращаетhttp://example.com/
-
parentdir("http://example.com/foo/")
возвращаетhttp://example.com/
-
parentdir("http://example.com/")
возвращаетhttp://example.com/
-
parentdir("http://example.com")
возвращаетhttp://example.com/
таким образом, у вас будут гораздо более стабильные результаты. Может, ты объяснишь, почему ты ... хотел удалить косую черту. Мой опыт заключается в том, что он создает больше проблем, поскольку вы не можете различать файл с именем "/foo" и папку с тем же именем без использования is_dir()
. Но если это важно для вас, вы могли бы удалить последний символ.
Я с hek2mgl. Однако, если скрипт не всегда находится в 2 каталогах ниже вашей цели, вы можете использовать explode:
$parts = explode("/",ltrim($_SERVER['SCRIPT_NAME'],"/"));
echo $_SERVER['HTTP_HOST'] . "/" . $parts[0];
Как упоминал hek2mgl, это правильно, и более динамичный подход будет dirname(dirname(htmlspecialchars($_SERVER['REQUEST_URI'])));
.
EDIT:
$_SERVER ['REQUEST_URI'] опустит имя домена. Ссыль постить @hek2mgl, вы можете echo dirname(dirname(htmlspecialchars($url)));
вот полезные команды, чтобы получить нужный путь:
( например, вы выполняете в http:// yoursite.com/folder1/folder2/file.php)
__FILE__ (on L.Hosting) === /home/xfiddlec/http_docs/folder1/folder2/yourfile.php
__FILE__ (on Localhost) === C:\wamp\www\folder1\folder2\yourfile.php
$_SERVER['HTTP_HOST'] === www.yoursite.com (or without WWW)
$_SERVER["PHP_SELF"] === /folder1/folder2/yourfile.php
$_SERVER["REQUEST_URI"] === /folder1/folder2/yourfile.php?var=blabla
$_SERVER["DOCUMENT_ROOT"] === /home/xfiddlec/http_docs
// BASENAME and DIRNAME (lets say,when __file__ is '/folder1/folder2/yourfile.php'
basename(__FILE__) ==== yourfile.php
dirname(__FILE__) ==== /folder1/folder2
примеры:
* домашний url ( yoursite.com )
<?php echo $_SERVER['HTTP_HOST'];?>
*базовый url файла ( yoursite.com/anyfolder/myfile.php )
<?php echo $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; ?>
* полный текущий url ( yoursite.com/anyfolder/myfile.php?action=blabla )
<?php echo $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];?>
*URL текущей папки ( yoursite.com/anyfolder/ )
<?php echo $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']); ?>
*чтобы получить RealPath к файлу (даже если он включен) (измените /var / public_html на нужный корень)
<?php
$cur_file=str_replace('\','/',__FILE__); //Then Remove the root path::
$cur_file=preg_replace('/(.*?)\/var\/public_html/','',$cur_file);
?>
p.s.для wordpress, существуют уже определенные функции для получения url плагинов или тем.
i.e. get plugin folder ( http://yoursite.com/wp-content/plugins/pluginName/ )
<?php echo plugin_dir_url( __FILE__ );?>