You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IIS仅无法识别Laravel简单路由中的PHP标签问题排查

Windows 11 + IIS 10下Laravel路由返回HTML字符串时PHP标签未解析问题排查

问题现象

本地开发环境为Windows 11 + IIS 10,Laravel项目出现异常:

  • 访问/info路由(直接返回HTML字符串)时,PHP标签未被解析,仅显示普通文本,浏览器开发者工具中PHP标签被注释
  • 访问/info2路由(返回Blade视图)时,phpinfo()可正常渲染
    已确认PHP运行正常,尝试修改IIS的Handler Mappings配置(添加*.html、*路径映射)但无效。

相关代码

routes/web.php

Route::get('/info', function() { return '<!DOCTYPE html>
    <html><head><title>Testing</title></head>
    <body>
        <p>Hello from simple route</p>
        <p><?php
            echo phpinfo();
        ?></p>
    </body></html>'; });
Route::get('/info2', function() { return view('info'); });

resources/views/info.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>Info Test 2</title>
</head><body>
    <p>Hello from Blade Template</p>
    <p><?php
        echo phpinfo();
    ?></p>
</body></html>

原因分析

  1. 路由返回字符串的处理逻辑:/info路由直接返回的是HTML字符串,Laravel会将该字符串原封不动作为HTTP响应内容输出,不会经过PHP解析器处理。PHP解析器仅处理指定类型的文件(如.php),而这里的响应是Laravel生成的静态文本,IIS收到后直接转发给客户端,不会触发PHP解析。
  2. Blade视图的处理逻辑:/info2返回的Blade视图,Laravel会先加载.blade.php文件,此时PHP解析器会执行文件中的PHP代码,生成最终HTML内容后再返回,因此phpinfo()能正常执行。
  3. IIS配置无效的原因:添加*.html或*的Handler Mapping是让IIS将对应静态文件交给PHP解析,但/info是通过Laravel入口文件index.php转发的动态请求,文件类型映射对动态生成的响应内容不起作用。

解决方法

方法1:直接在路由闭包中执行PHP逻辑

不在返回的HTML字符串中写PHP标签,而是在闭包内执行PHP代码,将结果拼接到HTML中:

Route::get('/info', function() {
    // 捕获phpinfo的输出内容
    ob_start();
    phpinfo();
    $phpInfoContent = ob_get_clean();
    
    return '<!DOCTYPE html>
        <html><head><title>Testing</title></head>
        <body>
            <p>Hello from simple route</p>
            <p>' . $phpInfoContent . '</p>
        </body></html>'; 
});

方法2:使用Blade渲染字符串

利用Laravel的Blade字符串渲染功能,让PHP代码被解析执行:

Route::get('/info', function() {
    $htmlContent = '<!DOCTYPE html>
        <html><head><title>Testing</title></head>
        <body>
            <p>Hello from simple route</p>
            <p><?php echo phpinfo(); ?></p>
        </body></html>';
    
    return Illuminate\Support\Facades\Blade::render($htmlContent);
});

方法3:改用视图文件(推荐)

若逻辑复杂,将HTML内容放到单独的Blade视图文件中,像/info2一样返回视图,便于代码维护和逻辑分离。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:45:52