【问题标题】:Detecting if a URL contains a certain string but NOT as a parameter using PHP使用 PHP 检测 URL 是否包含某个字符串但不作为参数
【发布时间】:2013-08-19 08:20:51
【问题描述】:

我正在尝试根据使用 PHP 的不同开发 url 强制执行不同的调试模式。我目前有这个设置:

$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === FALSE ? 'http' : 'https';
$host = $_SERVER['HTTP_HOST'];
$req_uri = $_SERVER['REQUEST_URI'];
$currentUrl = $protocol . '://' . $host . $req_uri;

$hostArray = array("localhost", "host.integration", "10.105.0"); //Don't use minification on these urls


for ($i = 0; $i < count($hostArray); $i++) {
    if (strpos($currentUrl, $hostArray[$i])) {
        $useMin = false;
    }
}

但是,使用此方法,如果您将主机数组中的任何字符串作为参数传递,您将能够触发 $useMin = false 条件,例如:

http://domain.com?localhost

除非 URL 以该条件开头(或者不包含在 url 参数中的 ? 之后的任何位置),否则我该如何编写阻止 $useMin = false 的内容?

【问题讨论】:

    标签: php development-environment url-parameters strpos


    【解决方案1】:

    在检查$hostArray时不要使用$currentUrl,只需检查$host本身是否在$hostArray中。

    如果您想检查是否完全匹配:

    if(in_array($host, $hostArray)) {
        $useMin = false;
    }
    

    或者也许您想这样做,并检查$hostArray 中的项目是否存在于您的$host 中的任何位置:

    foreach($hostArray AS $checkHost) {
        if(strstr($host, $checkHost)) {
            $useMin = false;
        }
    }
    

    如果您只想在$host $hostArray 中的一个项目开始时找到匹配项:

    foreach($hostArray AS $checkHost) {
        if(strpos($host, $checkHost) === 0) {
            $useMin = false;
        }
    }
    

    【讨论】:

    • 需要确保主机不包含 $hostArray[$i] - 但 strpos 似乎不起作用
    【解决方案2】:

    我无法发表评论,所以我会在这里发帖。为什么用url查看host数组,为什么不直接用host查看如下:

    if (strpos($host, $hostArray[$i])) {
    

    【讨论】:

    • 嘿 - 由于某种原因,这似乎不起作用。也许我不明白这个函数是如何工作的,但是如果我使用上面的代码,并通过localhost 访问该站点 - 尽管 $host 和 $hostArray[$i] 都回显为“localhost”,如果条件永远不会触发
    • 是的,对不起。使用: if (strpos($host, $hostArray[$i]) !== false) { 问题出在比赛开始的时候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2016-08-09
    • 2013-02-07
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多