如何在$ _SERVER [“SERVER_NAME”]中检测多个字符串?

时间:2015-05-03 20:24:32

标签: php superglobals

我想在$_SERVER["SERVER_NAME"]中检测一个字符串数组,为dev / prod等环境定义一个常量。
基本上,如果网址中包含localhost.dev,则会将常量设置为“prod”。

这是我的尝试但我总是得到"prod"即使我当前的网址是“localhost:3000”或“site.dev”:

// Define environment
$dev_urls = array(".dev", "localhost");
if (str_ireplace($dev_urls, "", $_SERVER["SERVER_NAME"]) == $_SERVER["SERVER_NAME"]){
    define("ENV", "dev");
} else {
    define("ENV", "prod");
}

最后使用了这个像魅力

的代码
// Define environment
$dev_urls = array(".dev", "localhost", "beta.");
if (str_ireplace($dev_urls, "", $_SERVER["HTTP_HOST"]) != $_SERVER["HTTP_HOST"]){
    define("ENV", "dev");
} else {
    define("ENV", "prod");
}

2 个答案:

答案 0 :(得分:3)

SERVER_NAME在服务器配置中定义,无论您使用哪个网址访问该网页,它都不会更改。

我相信你想改用HTTP_HOST

if ($_SERVER['HTTP_HOST'] == 'localhost' || substr($_SERVER['HTTP_HOST'], -4) == '.dev')
    define('ENV', 'dev');
else
    define('ENV', 'prod');

答案 1 :(得分:0)

您可以使用array_filter()anonymous function来完成您要找的工作。

$dev_urls = [".dev", "localhost"];
$host = $_SERVER["HTTP_HOST"];
$result = array_filter($dev_urls, function($e) use ($host) {
    return strpos($host, $e) !== false;
});
if ($result) {
    //development URL
} else {
    //production URL
}

但是,这是一个子字符串搜索,可能不准确。我建议改为完全匹配。

$dev_urls = ["foo.dev", "localhost"];
$host = $_SERVER["HTTP_HOST"];
$result = array_filter($dev_urls, function($e) use ($host) {
    return $host === $e;
});
if ($result) {
    //development URL
} else {
    //production URL
}