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

mv1qrgav  于 2023-02-28  发布在  PHP
关注(0)|答案(5)|浏览(101)

是否可以在PHP CLI server中启用CORS(如果可以,如何启用)?
编辑:为了解决一些评论,比如我应该只在脚本中包含头文件,请注意,我的代码中没有任何PHP文件/脚本。我只是将PHP CLI服务器用作轻量级本地托管选项。因此,理想情况下,答案将提供CLI选项,或者显示没有。

qgzx9mmu

qgzx9mmu1#

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

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

网页浏览/开发路由. 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";  // or '*' for all   

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

function applyCorsHeaders($origin) {
    header("Access-Control-Allow-Origin: $origin");
    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($CORS_ORIGIN_ALLOWED);

    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 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
}
mf98qq94

mf98qq942#

对于那些还在为此挠头的人,我遇到了同样的问题,并解决了它。对我来说,从Webpack开发服务器代理到PHP开发服务器不起作用。
当您使用localhost作为服务器时,服务器中内置的PHP似乎会出现CORS问题。相反,您应该使用您的本地IP地址,或仅使用127.0.0.1,后者也指向您的本地计算机。因此,您可以按如下方式启动服务器:

php -S 127.0.0.1:8888 -t public

现在Webpack开发服务器代理可以工作了。你也可以使用0.0.0.0。希望这能有所帮助。

slmsl1lt

slmsl1lt3#

用户来自谷歌并使用内置的php服务器:在file-to-be-served.php中的第一行输入:

header("Access-Control-Allow-Origin: *");

取自:https://enable-cors.org/server_php.html

gc0ot86w

gc0ot86w4#

对于staic文件,解决这个问题的最简单方法是创建一个router.php文件,其内容如下所示,然后像sudo php -S 127.0.0.1:80 -t public router.php这样启动服务器

<?php

$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "yaml") {
    header("Access-Control-Allow-Origin: *");
    readfile($_SERVER["SCRIPT_FILENAME"]);
    return true;
}

return false;

?>

public是提供应用程序的文件夹(在我的例子中是Laravel应用程序)。
您可以更新router.php脚本以包含更多应启用CORS的文件扩展名(js、css)。
对于应用程序本身(没有静态文件),您应该找到一种方法,将以下标头添加到所有请求中。

header("Access-Control-Allow-Origin: *");
z9gpfhce

z9gpfhce5#

此功能未在内部Web服务器中实现。Web服务器仅用于基本测试,不用于生产。请注意documentation顶部的 * 红色 * 框:

    • 警告**

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

相关问题