heroku不支持传统伪静态因路由由其统一转发且不加载mod_rewrite或读取配置文件,thinkphp需启用pathinfo模式并从$_server['request_uri']解析路径。

Heroku 上无法直接使用 Apache 的 .htaccess 或 Nginx 的 location 块配置伪静态,因为 Heroku 不暴露 Web 服务器配置层——所有 HTTP 请求都由 Heroku 路由器统一转发到你的应用进程(即 PHP-FPM 或内置服务器),index.php 必须作为唯一入口且承担全部路由解析责任。
为什么 Heroku 不支持传统伪静态规则
Heroku 的构建和运行机制决定了它不加载 mod_rewrite,也不允许修改 Nginx/Apache 配置文件。你提交的代码包中即使包含 .htaccess 或自定义 nginx.conf,也不会被读取或生效。所有请求默认以标准 CGI 环境变量(如 $_SERVER['REQUEST_URI'])透传给 index.php,框架必须自己解析路径。
- Heroku 的路由器会把
/user/profile、/api/v1/posts这类路径原样塞进$_SERVER['REQUEST_URI'] -
$_SERVER['PATH_INFO']在 Heroku 的 PHP 环境中通常为空或不可靠,不能依赖 - 任何试图在
public/下放.htaccess或用Procfile启动 Nginx 的方案,都会因权限/架构限制失败
ThinkPHP 在 Heroku 上必须启用 PATHINFO 模式
TP5/6 默认使用 QUERY_STRING 模式(?s=/user/profile),但 Heroku 要求 URL 干净,所以必须强制走 PATHINFO,并让框架从 $_SERVER['REQUEST_URI'] 中提取路由信息。关键配置如下:
- 在
config/app.php中设置:'url_route_on' => true、'pathinfo_depr' => '/' - 确保
'url_common' => false(禁用普通模式,避免 fallback 到 query string) - TP6 可额外加:
'app_host' => ''和'url_convert' => false,防止 Host 或大小写干扰 - 不要设
URL_MODEL(TP5)或url_type(TP6)为 1 或 3,只认0(兼容模式)或留空(自动推导)
这样 ThinkPHP 就会把 /user/profile 当作 PATHINFO 处理,而不是等待 Web 服务器重写后注入 PATH_INFO 环境变量。
Procfile 和 public/index.php 要做最小化适配
Heroku 启动 PHP 应用靠 Procfile,而 ThinkPHP 的 public/index.php 默认假设自己在 Web 根目录下运行。你需要微调两处:
-
Procfile写成:web: vendor/bin/heroku-php-apache2 public/(推荐)或web: php -S 0.0.0.0:$PORT -t public/ public/router.php - 如果用内置服务器,需在
public/router.php中手动补全$_SERVER['PATH_INFO']:if (isset($_SERVER['REQUEST_URI'])) { $_SERVER['PATH_INFO'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); } - 确认
public/是实际 DocumentRoot —— Heroku 不允许改 root,所以项目结构必须是public/目录下放index.php,而非整个 ThinkPHP 根目录暴露出去
常见 404 场景和验证方法
部署后访问 /user/login 返回 404,大概率不是规则没生效,而是框架没收到原始路径:
- 用
heroku logs --tail查看是否报Undefined index: PATH_INFO或路由未匹配 - 临时在
public/index.php开头加var_dump($_SERVER['REQUEST_URI']); die;,确认 Heroku 是否真把路径传进来了 - 检查
route.php中是否定义了对应规则,比如Route::get('user/login', 'user.login');TP6 的注解路由需确认扫描已开启 - 确保
public/下没有真实存在的user/目录或login.html文件——Heroku 不做文件存在性判断,但本地测试时容易误判
Heroku 的伪静态本质是「无重写、纯框架解析」,所有逻辑收束在 PHP 层。最容易被忽略的是:你以为服务器该做的事,其实得由 ThinkPHP 自己扛下来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











