是否可以在PHP CLI服务器中启用CORS?

时间:2015-04-14 00:42:30

标签: php cors

是否可以在PHP CLI server中启用CORS(如果是,如何)?

编辑:为了解决诸如我应该在我的脚本中包含标题的注释,请注意我的代码中没有任何PHP文件/脚本。我只是使用PHP CLI服务器作为轻量级本地托管选项。因此,理想情况下,答案将提供CLI选项,或显示没有。

3 个答案:

答案 0 :(得分:2)

此功能未在内部Web服务器中实现。 Web服务器仅用于基本测试,而不用于生产。请注意documentation

顶部的红色
  

警告

     

此Web服务器旨在帮助应用程序开发。它也可用于测试目的或在受控环境中运行的应用程序演示。它不是一个功能齐全的Web服务器。它不应该在公共网络上使用。

答案 1 :(得分:2)

使用php routings脚本在webhook文件夹中使用DocumentRoot启动服务器:

php -S localhost:8888 -t webhook webhook/dev-routings.php

webhook / dev-routings.php:

<?php
// Copyright Monwoo 2017, service@monwoo.com
// Enabling CORS in bultin dev to test locally with multiples servers
// used to replace lack of .htaccess support inside php builting webserver.
// call with :
// php -S localhost:8888 -t webhook webhook/dev-routings.php
$CORS_ORIGIN_ALLOWED = "http://localhost:3000";    

function consoleLog($level, $msg) {
    file_put_contents("php://stdout", "[" . $level . "] " . $msg . "\n");
}

function applyCorsHeaders() {
    global $CORS_ORIGIN_ALLOWED;
    header("Access-Control-Allow-Origin: {$CORS_ORIGIN_ALLOWED}");
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type, Accept');
}

if (preg_match('/\.(?:png|jpg|jpeg|gif|csv)$/', $_SERVER["REQUEST_URI"])) {
    consoleLog('info', "Transparent routing for : " . $_SERVER["REQUEST_URI"]);
    return false;
} else if (preg_match('/^.*$/i', $_SERVER["REQUEST_URI"])) {
    $filePath = "{$_SERVER['DOCUMENT_ROOT']}/{$_SERVER["REQUEST_URI"]}";
    applyCorsHeaders();

    if (!file_exists($filePath)) {
        consoleLog('info', "File not found Error for : " . $_SERVER["REQUEST_URI"]);
        // return false;
        http_response_code(404);
        echo "File not Found : {$filePath}";
        return true;
    }
    $mime = mime_content_type($filePath);
    // https://stackoverflow.com/questions/45179337/mime-content-type-returning-text-plain-for-css-and-js-files-only
    // https://stackoverflow.com/questions/7236191/how-to-create-a-custom-magic-file-database
    // Otherwise, you can use custom rules :
    $customMappings = [
        'js' => 'text/javascript', //'application/javascript',
        'css' => 'text/css',
    ];
    $ext = pathinfo($filePath, PATHINFO_EXTENSION);
    // consoleLog('Debug', $ext);
    if (array_key_exists($ext, $customMappings)) {
        $mime = $customMappings[$ext];
    }
    consoleLog('info', "CORS {$CORS_ALLOWED} added to file {$mime} : {$filePath}");
    header("Content-type: {$mime}");
    echo file_get_contents($filePath);
    return true;
} else {
    consoleLog('info', "Not catched by routing, Transparent serving for : "
    . $_SERVER["REQUEST_URI"]);
    return false; // Let php bultin server serve
}

答案 2 :(得分:0)

对于你们中那些仍在挠头的人,我也遇到了同样的问题并想出了办法。对我来说,从Webpack开发服务器到我的PHP开发服务器的代理不起作用。

当您将localhost用于服务器时,似乎内置的PHP服务器的CORS出现了问题。相反,您应该使用本地IP地址,或者仅使用127.0.0.1,它再次指向本地计算机。因此,您将像这样启动服务器:

php -S 127.0.0.1:8888 -t public

现在,Webpack Dev Server代理可以工作。您也可以使用0.0.0.0。希望这可以帮助。