罪在人民 發表於 2026-5-3 17:21:16

ThinkPHP中跨域请求设置的几种方式

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">通过设置 HTTP 头信息</a></li><li><a href="#_label1">使用跨域资源共享(CORS)扩展</a></li><li><a href="#_label2">使用代理服务器</a></li></ul></div><p>在 ThinkPHP 中支持跨域请求,通常有以下几种方式:</p>
<p class="maodian"><a name="_label0"></a></p><h2>通过设置 HTTP 头信息</h2>
<ul><li><p><strong>在控制器方法中设置</strong>在需要支持跨域的控制器方法中,设置允许跨域的 HTTP 头信息。可以使用<code>header()</code>函数来设置,例如:</p></li></ul>
<div class="jb51code"><pre class="brush:php;">public function yourMethod()
{
    // 设置允许所有来源的请求
    header('Access-Control-Allow-Origin: *');
    // 设置允许的请求方法
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
    // 设置允许的请求头
    header('Access-Control-Allow-Headers: Content-Type, Authorization');

    // 其他业务逻辑代码
    return json(['message' =&gt; '跨域请求成功']);
}
</pre></div>
<ul><li><p><strong>使用中间件设置</strong>创建一个中间件来统一设置跨域头信息。例如,使用 ThinkPHP 的命令行工具生成中间件:</p></li></ul>
<p>收起</p>
<p>bash</p>
<div class="jb51code"><pre class="brush:bash;">php think make:middleware CorsMiddleware
</pre></div>
<p>然后在生成的<code>CorsMiddleware</code>类中,在<code>handle</code>方法中设置跨域头:</p>
<div class="jb51code"><pre class="brush:php;">&lt;?php

namespace app\middleware;

class CorsMiddleware
{
    public function handle($request, \Closure $next)
    {
      // 设置允许所有来源的请求
      header('Access-Control-Allow-Origin: *');
      // 设置允许的请求方法
      header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
      // 设置允许的请求头
      header('Access-Control-Allow-Headers: Content-Type, Authorization');

      if ($request-&gt;method() === 'OPTIONS') {
            // 对于预检请求,直接返回200状态码
            return response('', 200);
      }

      return $next($request);
    }
}
</pre></div>
<p>最后,在<code>app/middleware.php</code>文件中注册中间件:</p>
<div class="jb51code"><pre class="brush:php;">return [
    // 其他中间件...
    app\middleware\CorsMiddleware::class,
];
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>使用跨域资源共享(CORS)扩展</h2>
<ul><li><p>可以使用一些第三方的 CORS 扩展来简化跨域设置。例如,<code>fruitcake/laravel-cors</code>扩展,虽然它是为 Laravel 设计的,但也可以在 ThinkPHP 项目中使用。</p></li><li><p>首先,通过 Composer 安装扩展:</p></li></ul>
<div class="jb51code"><pre class="brush:bash;">composer require fruitcake/laravel-cors
</pre></div>
<ul><li><p>然后,在项目中进行配置。在<code>config</code>目录下创建一个<code>cors.php</code>配置文件,内容如下:</p></li></ul>
<div class="jb51code"><pre class="brush:php;">&lt;?php

return [
    'paths' =&gt; ['api/*'],
    'allowed_methods' =&gt; ['*'],
    'allowed_origins' =&gt; ['*'],
    'allowed_origins_patterns' =&gt; [],
    'allowed_headers' =&gt; ['*'],
    'exposed_headers' =&gt; [],
    'max_age' =&gt; 0,
    'supports_credentials' =&gt; false,
];
</pre></div>
<ul><li><p>最后,创建一个中间件来应用 CORS 配置。例如:</p></li></ul>
<div class="jb51code"><pre class="brush:php;">&lt;?php

namespace app\middleware;

use Fruitcake\Cors\HandleCors;

class CorsMiddleware
{
    protected $cors;

    public function __construct(HandleCors $cors)
    {
      $this-&gt;cors = $cors;
    }

    public function handle($request, \Closure $next)
    {
      return $this-&gt;cors-&gt;handle($request, $next);
    }
}
</pre></div>
<p>同样,需要在<code>app/middleware.php</code>文件中注册这个中间件。</p>
<p class="maodian"><a name="_label2"></a></p><h2>使用代理服务器</h2>
<ul><li><p><strong>Nginx 代理</strong>可以在 Nginx 服务器上设置代理来解决跨域问题。假设你的 ThinkPHP 应用运行在<code>http://backend.example.com</code>,而前端应用在<code>http://frontend.example.com</code>。在 Nginx 配置文件中添加如下配置:</p></li></ul>
<div class="jb51code"><pre class="brush:plain;">server {
    listen       80;
    server_namefrontend.example.com;

    location / {
      proxy_pass http://backend.example.com;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
</pre></div>
<p>这样,前端应用访问<code>http://frontend.example.com</code>时,Nginx 会将请求代理到<code>http://backend.example.com</code>,从而避免了跨域问题。</p>
<ul><li><p><strong>Apache 代理</strong>如果使用 Apache 作为服务器,可以通过<code>mod_proxy</code>模块来设置代理。在 Apache 配置文件中添加以下内容:</p></li></ul>
<div class="jb51code"><pre class="brush:bash;">ProxyPass / http://backend.example.com/
ProxyPassReverse / http://backend.example.com/
</pre></div>
<p>这将把所有请求代理到后端的 ThinkPHP 应用,实现跨域访问。</p>
頁: [1]
查看完整版本: ThinkPHP中跨域请求设置的几种方式