azure上thinkphp伪静态返回404的根本原因是:windows stack用iis需web.config重写规则,linux stack默认不支持直接编辑nginx配置,且必须启用premium层的自定义nginx配置并上传nginx.conf,同时需确保thinkphp路由开关开启及path_info正确传递。

Azure App Service 默认不支持 Apache 的 .htaccess,也不原生加载 mod_rewrite;Nginx 也不是默认 Web 服务器——它用的是 IIS(Windows Stack)或自研的 HTTP 平台(Linux Stack),所以直接套用本地 Apache/Nginx 规则必然 404 或跳转失败。
为什么 Azure 上 ThinkPHP 伪静态总返回 404?
根本原因不是规则写错,而是 Azure 的 Windows Stack 使用 IIS,必须靠 web.config 驱动重写;而 Linux Stack 虽跑 Nginx,但实际由反向代理层接管,location 块无法直接编辑,只能通过 web.config(Windows)或 nginx.conf 覆盖(Linux,需启用“自定义 Nginx 配置”且仅限 Premium 层)。
- Azure Windows Stack:IIS +
web.config是唯一生效入口,.htaccess完全被忽略 - Azure Linux Stack(B1 及以上):默认用反向代理,
/etc/nginx/conf.d/azure-site.conf不可写;只有启用「自定义 Nginx 配置」并上传nginx.conf才能控制 rewrite - ThinkPHP 的
url_route_on和url_html_suffix必须开启,否则即使重写成功,框架也按原始 URL 解析,仍会漏掉路由
Windows Stack 下必须用 web.config 替代 .htaccess
在项目根目录(即 index.php 所在目录)放置 web.config,内容必须严格匹配 IIS Rewrite 模块语法。以下是最简可用配置:
<configuration><system.webserver><rewrite><rules><rule name="ThinkPHP" stopprocessing="true"><match url="^(.*)$"></match><conditions logicalgrouping="MatchAll"><add input="{REQUEST_FILENAME}" matchtype="IsFile" negate="true"></add><add input="{REQUEST_FILENAME}" matchtype="IsDirectory" negate="true"></add></conditions><action type="Rewrite" url="index.php?s={R:1}"></action></rule></rules></rewrite></system.webserver></configuration>
-
stopProcessing="true"必须加,避免后续规则干扰 -
url="index.php?s={R:1}"中的s=是 ThinkPHP 默认的 pathinfo 入口参数,不能写成/index.php/{R:1}—— IIS 不支持 PATH_INFO 自动注入 - 若用 ThinkPHP 6+ 或自定义
URL_ROUTER_ON为 false,则需改用index.php/{R:1}并确保 PHP 配置中cgi.fix_pathinfo=1
Linux Stack 启用自定义 Nginx 配置的硬性条件
只有 App Service Plan 为 Premium v3 或 Isolated 时,才能在 Portal 中开启「自定义 Nginx 配置」开关,并上传自己的 nginx.conf。普通 B1/S1 不支持。
- 上传路径必须是
/home/site/wwwroot/nginx.conf(注意不是conf.d子目录) - 规则必须包裹在
location / { ... }内,且末尾用last,例如:rewrite ^(.*)$ /index.php?s=$1 last; - 不能省略
try_files $uri $uri/ /index.php?s=$1;这类 fallback,否则静态资源(CSS/JS)可能被错误转发 - 上传后需重启 App Service,且
nginx -t不可手动执行 —— Azure 会自动校验并加载
最容易被忽略的验证点:PATH_INFO 和 $_SERVER['REQUEST_URI']
即使 web.config 或 nginx.conf 表面生效,ThinkPHP 仍可能解析出错,因为 Azure 的 IIS/Nginx 层会修改原始请求头。务必检查两点:
- 在
index.php开头临时加var_dump($_SERVER['REQUEST_URI'], $_SERVER['PATH_INFO'], $_GET); die();,确认$_SERVER['REQUEST_URI']是否含原始路径(如/user/profile),而非仅/index.php?s=user/profile - 若
PATH_INFO为空,说明 IIS 没传递,需在web.config的<fastcgi></fastcgi>节点里显式设置php_flag[ cgi.fix_pathinfo ] = 1(仅 Windows Stack 支持) - Linux Stack 下,
$_SERVER['REQUEST_URI']通常保留完整路径,但$_SERVER['PATH_INFO']依赖 Nginx 的fastcgi_split_path_info配置 —— 自定义nginx.conf里必须包含该指令
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











