在Windows Server 2012 R2的IIS上WordPress二级目录页面404问题求助
解决Windows Server 2012 R2上IIS下WordPress子目录与ASP.NET共存的404问题
我碰到过好多次这种ASP.NET站点根目录下挂WordPress子目录的场景,你的问题核心是URL重写规则的逻辑搞反了,而且匹配范围太窄,我给你一步步梳理解决方案:
1. 修正根目录ASP.NET站点的web.config重写规则
你原来的规则只匹配了wordpress/about-us这个特定页面,而且条件是当请求是文件或目录时才重写,这完全和WordPress的路由逻辑相反——WP需要的是当请求不是真实文件/目录时,把请求转发到index.php处理。
替换根目录web.config里的规则为:
<rule name="WordPress Subdirectory" enabled="true" patternSyntax="ECMAScript" stopProcessing="true"> <match url="^wordpress/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="wordpress/index.php/{R:1}" /> </rule>
^wordpress/(.*):匹配所有以wordpress/开头的请求路径,覆盖你所有的文章、页面链接negate="true":表示只有当请求的路径不是真实存在的文件或目录时,才触发重写wordpress/index.php/{R:1}:把请求转发到WP子目录的index.php,同时保留原路径的参数(比如about-us),让WP的路由系统处理
2. 检查WordPress子目录的web.config(如果存在)
如果wordpress目录下有自己的web.config,建议暂时注释掉里面的重写规则,避免和根目录的规则冲突。之后如果需要单独配置子目录,可以用这个简化版规则:
<rule name="WordPress Internal" patternSyntax="Wildcard"> <match url="*" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php" /> </rule>
3. 确认WordPress的后台设置
登录WordPress后台,做这两个检查:
- 设置→常规:确认“站点地址(URL)”是
http://example.com/wordpress,“WordPress地址(URL)”如果是子目录安装,也填同一个地址就行 - 设置→固定链接:选择“文章名称”(也就是
/%postname%),然后点击保存更改——这一步会让WP更新内部的路由规则,同时尝试生成对应的重写配置(IIS下会更新子目录的web.config,但我们已经用根目录规则覆盖了,不过保存操作还是要做)
4. 验证IIS的URL Rewrite模块
确保你已经安装了URL Rewrite 2.0模块:打开IIS管理器,在“功能视图”里找有没有“URL Rewrite”的图标,如果没有,需要通过服务器管理器的“添加角色和功能”来安装这个模块——没有它的话,所有重写规则都不会生效。
5. 权限和PHP映射检查
- 给wordpress目录添加
IIS_IUSRS用户的读写权限,确保WP能读取文件,IIS能正确访问 - 确认PHP的处理映射已经配置到wordpress目录(或者整个站点),确保
.php文件能被IIS正确解析,不会返回静态文本或者404
做完这些步骤后,重启一下IIS站点,再访问example.com/wordpress/about-us试试,应该就能正常打开了。
内容的提问来源于stack exchange,提问作者dahnfalomi
相关产品推荐
相关产品推荐

