You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel API切换HTTPS后所有接口返回404错误求助

Laravel API切换HTTPS(Cloudflare)后404问题排查方案

嘿,我来帮你捋捋这个切换HTTPS后API全报404的问题——结合你用Cloudflare的情况,大概率是几个配置环节没衔接好,咱们一步步排查:

1. 确认Cloudflare的SSL模式是否正确

Cloudflare的SSL/TLS模式直接影响请求转发的协议,这是最常见的坑:

  • 如果你服务器本身没安装SSL证书:选「灵活」模式(Cloudflare和浏览器用HTTPS,Cloudflare到你服务器用HTTP)
  • 如果你服务器已经配置了自己的SSL证书:选「完全」或「严格」模式(全程HTTPS加密)
    你可以在Cloudflare控制台的「SSL/TLS」→「概述」里查看当前模式,先切换成对应模式测试下。

2. 让Laravel强制识别HTTPS并信任Cloudflare代理

之前你试过强制HTTPS的方案,可能没配全Cloudflare的代理信任:

步骤1:配置.env文件

确保APP_URL设置为HTTPS地址:

APP_URL=https://www.traapp.tk

步骤2:强制HTTPS协议

app/Providers/AppServiceProvider.phpboot方法里添加:

public function boot()
{
    \URL::forceScheme('https');
}

步骤3:信任Cloudflare的代理头

Cloudflare会给服务器发送X-Forwarded-Proto头标识真实协议,但Laravel默认不信任外部代理头,需要配置:
打开config/trustedproxy.php(Laravel 5.5+自带),修改:

// 生产环境建议替换成Cloudflare官方IP段,这里先用*测试
'proxies' => '*',
'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL,

如果是Laravel 8+,也可以在.env里加:

TRUSTED_PROXIES=*

3. 更新.htaccess添加HTTPS强制跳转和代理头支持

你的.htaccess目前没有处理HTTPS跳转,建议补充规则放在RewriteEngine On之后:

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On

# 新增:强制跳转到HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# 新增:传递Cloudflare的X-Forwarded-Proto头(确保Laravel识别真实协议)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ - [L]

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

4. 排查Cloudflare缓存干扰

Cloudflare默认可能缓存静态资源,但如果不小心缓存了API请求,会导致旧的HTTP缓存或404页面被返回:

  • 打开Cloudflare控制台「缓存」→「规则」,添加一条规则:
    • 匹配路径:/api/*
    • 缓存级别:设置为「不缓存」
  • 或者临时开启「开发模式」(在「缓存」→「概述」里),测试API是否恢复正常,排除缓存问题。

5. 测试基础路由排除业务逻辑问题

先抛开认证和控制器逻辑,创建一个无依赖的测试路由,确认HTTPS路由本身能正常工作:
routes/api.php里添加:

Route::get('/test', function() {
    return response()->json(['status' => 'ok', 'message' => 'HTTPS API works!']);
});

然后访问https://www.traapp.tk/api/test,如果能正常返回JSON,说明路由系统本身没问题,问题可能出在认证逻辑或控制器的外部请求上;如果还是404,那大概率是前面的配置没到位。

最后验证服务器SSL配置(可选)

如果以上都没解决,检查你的服务器(Apache/Nginx)是否正确配置了SSL:

  • Apache:确认监听443端口,加载mod_ssl模块,虚拟主机配置了SSLCertificateFileSSLCertificateKeyFile
  • Nginx:确认配置了listen 443 ssl;,并指定ssl_certificatessl_certificate_key路径

内容的提问来源于stack exchange,提问作者Steven

火山引擎 最新活动