在PHP中尝试获取没有文件名的完整URL
我原以为这很简单,但我似乎找不到一个包含我要查找的内容的在PHP中尝试获取没有文件名的完整URL,php,Php,我原以为这很简单,但我似乎找不到一个包含我要查找的内容的$\u SERVER数组变量 假设我的url是http://example.com/subdirectory/index.php我想获取除文件名以外的所有文件-http://example.com/subdirectory/ 我知道我可以很容易地通过一些字符串操作来实现这一点,但我想知道是否有我刚刚丢失的\u服务器数组的变量。我已经试过所有这些方法,看看它们能给我什么,除了我要找的以外,我什么都能得到。不会有,因为它不是跟踪的有用属性。如果
$\u SERVER
数组变量
假设我的url是http://example.com/subdirectory/index.php
我想获取除文件名以外的所有文件-http://example.com/subdirectory/
我知道我可以很容易地通过一些字符串操作来实现这一点,但我想知道是否有我刚刚丢失的
\u服务器
数组的变量。我已经试过所有这些方法,看看它们能给我什么,除了我要找的以外,我什么都能得到。不会有,因为它不是跟踪的有用属性。如果当前脚本不是索引。*
,则它不会返回当前脚本的正确URL
但是,这可能会满足您的需求:
echo '//'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
编辑:此外,除了为Firefox安装php.net在线手动搜索工具并使用搜索关键字进行设置(通过在URL栏中键入类似“
php$\u SERVER
”的内容,您可以在var\u dump()
和print\r()上调出global上的文档)之外,您还应该知道var\u dump()
用于输出任何变量的完整内容,包括数组和对象。这对于调试非常有用。您可以使用它来获取url的路径
我似乎找不到$\u服务器数组的变量,该变量包含我要查找的内容
因为它是虚构的字符串,仅存在于浏览器的地址栏中。
它的部分被分别发送到服务器
我想知道是否存在_服务器阵列的变量
这很容易知道。只需print\r($\u服务器)代码>非常简单
我知道我可以很容易地通过一些字符串操作来实现这一点
嗯。您必须编写的代码少于此问题文本
但通过一些手动魔法,它可以简化为一个功能 没有为您想要的内容定义变量
您可以使用以下代码获取完整的基本url:
// Base folder url
$myBase = ( (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
但希望在大多数情况下,您不需要完整的内容,只需使用:
// Base folder server root path
$myBase = dirname($_SERVER['PHP_SELF']);
如果您使用某种路由系统(mod_rewrite),请务必小心。在您的情况下,字符串操作是最好的解决方案
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$path = $protocol.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
例如:
substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/') + 1);
这对我来说非常有效,似乎是一个非常干净的解决方案
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$path = $protocol.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
另一种解决方案是使用老式的get-path方法(),它不需要dirname
,也不需要http
和https
。
然后检查路径是否以文件扩展名“.php”结尾。如果为true,请将其从路径中删除
长版本
$current\u url\u path=(isset($\u SERVER['HTTPS'])和&$\u SERVER['HTTPS']==='on'?“HTTPS:“http”)。“://$\u服务器[HTTP\u主机]$\u服务器[REQUEST\u URI]”;
if(substr($current\u url\u path,-4)=“.php”){
//路径以.php结尾
//将字符串拆分为数组
$arr=explode(“/”,$current\u url\u path);
//删除最后一个数组项(位于文件的最后一个/之后)
$arrS=数组\ U片($arr,0,-1);
//将数组连接到字符串
$current\u url\u path=内爆(“/”,$arrS);
}
echo$current\u url\u路径;
缩短版
$current\u url\u path=(isset($\u SERVER['HTTPS'])和&$\u SERVER['HTTPS']==='on'?“HTTPS:“http”)。“://$\u服务器[HTTP\u主机]$\u服务器[REQUEST\u URI]”;
$current\u url\u path=substr($current\u url\u path,-4)=“.php”?
内爆(“/”,数组切片((分解(“/”,$current\u url\u path)),0,-1)):$current\u url\u path;
echo$current\u url\u路径;
测试
此url:http://localhost/comp-test/test.php
返回为http://localhost/comp-test
但是请注意,您不应该假设dirname()等于url路径。在我的情况下,它不起作用,获取类似http://magento.p111111.webspaceconfig.de/magento.p111111.webspaceconfig.de/
@Stefan:你可以试试JackFuchs写的$\u服务器['REQUEST\u URI']
。也许您正在使用某种形式的URL重写,docroot将wwwroot的服务位置提高了一个级别。让我知道这对你是否有效。我在direnameWatch之前得到两个斜杠,dirname不会以斜杠结尾,除非它是主页,在主页上它只是“/”,所以如果你使用dirname($\u SERVER['PHP\u SELF'])。“/文件夹”;只有在主页上,你才会连续有两条斜线。问得好。感谢可能存在的副本或substr($\u服务器['REQUEST\u URI'],0,strrpos($\u服务器['REQUEST\u URI'],'\\')+1);在windows服务器上我不这么认为Vincent。因为我们在这里操作的是URI,而不是windows文件路径!