Windows IIS服务器下CakePHP子目录WordPress伪静态404问题求助
解决方案:修复CakePHP + WordPress在IIS 8.5下的伪静态404问题
我帮你梳理了现有配置里的问题,主要是根目录web.config的规则顺序不合理,导致WordPress的伪静态请求被CakePHP的规则拦截了。按照下面的步骤调整配置,就能解决404问题:
一、确认IIS必备组件
- 先确保你的IIS已经安装了URL重写模块,如果没装的话,去服务器管理器的「角色和功能」里添加——这是伪静态功能生效的基础,没它一切白搭。
二、修正根目录(cakePHP文件夹)的web.config
原来的根配置里,虽然有放行blog的规则,但后续的资源重写规则会误把blog的请求导向CakePHP的webroot,而且规则顺序也不对。替换成下面的配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 1. 优先放行blog目录的所有请求,直接交给blog下的配置处理 --> <rule name="Pass through to WordPress blog" stopProcessing="true"> <match url="^blog(/.*)?$" /> <action type="None" /> </rule> <!-- 2. HTTP强制转HTTPS --> <rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" /> </rule> <!-- 3. 排除直接访问app/webroot的特定路径 --> <rule name="Exclude direct access to app/webroot/*" stopProcessing="true"> <match url="^app/webroot/c$" ignoreCase="false" /> <action type="None" /> </rule> <!-- 4. 重写CakePHP的静态资源请求 --> <rule name="Rewrite routed access to assets" stopProcessing="true"> <match url="^(buyanddelight|crm_geet|geet_jewellery1|geet_jewellery|img|css|files|js|favicon.ico)(.*)$" /> <action type="Rewrite" url="app/webroot/{R:1}{R:2}" appendQueryString="false" /> </rule> <!-- 5. 其他所有请求交给CakePHP处理 --> <rule name="Rewrite requested file/folder to index.php" stopProcessing="true"> <match url="^(.*)$" ignoreCase="false" /> <action type="Rewrite" url="index.php" appendQueryString="true" /> </rule> </rules> </rewrite> <httpErrors errorMode="Custom" defaultPath="C:\Inetpub\wwwroot\Indexhome_.htm"> <error statusCode="403" subStatusCode="4" path="C:\Inetpub\wwwroot\Indexhome_.htm" responseMode="File" /> </httpErrors> </system.webServer> </configuration>
修改要点:
- 把放行blog的规则移到最顶部,确保所有
blog/开头的请求都不会被CakePHP的规则拦截; - 移除了资源重写规则里的
blog条目,避免把WordPress的静态资源误导向CakePHP的webroot。
三、调整blog目录下的web.config
原来的规则用了Wildcard语法,换成更精准的正则表达式语法,确保伪静态路径能被正确匹配:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="WordPress Rewrite" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php/{R:0}" appendQueryString="true" /> </rule> </rules> </rewrite> <!-- 可选:禁用目录浏览,更安全 --> <directoryBrowse enabled="false" /> </system.webServer> </configuration>
修改要点:
- 用
.*匹配所有URL路径,比Wildcard的*兼容性更好; - 重写动作里添加
/{R:0},确保WordPress能正确获取伪静态路径的参数。
四、WordPress后台收尾设置
- 登录WordPress后台,进入「设置 → 固定链接」;
- 选择你需要的伪静态格式(比如「文章名称」),点击「保存更改」——这一步会让WordPress确认重写规则,同时生成内部路由逻辑。
五、测试验证
- 访问
https://www.baseurl.com/blog/hello-world/,应该能正常打开文章页面,不再返回404; - 同时验证CakePHP的正常访问、静态资源加载是否不受影响。
内容的提问来源于stack exchange,提问作者Gimi
相关产品推荐
相关产品推荐

