伪静态的主要目的是将动态的、带有查询参数的 URL(如 index.php?id=123)转换为更简洁、对搜索引擎更友好的静态 URL(如 article/123),在 IIS 环境下,我们通常使用 URL Rewrite 模块 来实现这个功能。

第一步:安装 URL Rewrite 模块
这是所有配置的前提,如果你的 IIS 没有安装此模块,将无法进行后续操作。
-
下载模块:
- 访问微软官方下载页面:URL Rewrite Module
- 根据你的服务器操作系统(32位或64位)下载相应的安装包,通常服务器都是 64 位,下载
x64版本即可。
-
安装模块:
- 下载后,双击运行安装程序,安装过程非常简单,基本上就是“下一步”直到完成。
- 安装完成后,需要重启 IIS 服务 或重启服务器才能生效,重启 IIS 的方法:
- 打开命令提示符(管理员身份)。
- 输入命令:
iisreset并回车。
-
验证安装:
(图片来源网络,侵删)- 打开 IIS 管理器。
- 在左侧的“管理”区域,你应该能看到一个名为 “URL 重写” 的图标,这表示模块已成功安装。
第二步:配置伪静态规则
安装好模块后,我们就可以为具体的网站配置重写规则了,这里我们分两种最常见的情况:
将 .html 或其他静态后缀的请求重写为 .php 文件(常见于 PHP 网站)
这种规则的目的是为了让用户访问 about.html 时,实际上服务器执行的是 about.php 文件,但 URL 保持美观。
操作步骤:
-
在 IIS 管理器中,选择你想要配置的网站。
(图片来源网络,侵删) -
双击打开 “URL 重写” 功能。
-
在右侧的“操作”面板中,点击 “添加规则...”。
-
在弹出的“添加规则”窗口中,选择 “入站规则”,然后点击“确定”。
-
在“编辑入站规则”窗口中,进行如下设置:
- 名称:给规则起一个有意义的名字,
Rewrite HTML to PHP。 - 匹配的 URL:
- 模式:这里填写你想要匹配的 URL 格式,如果你想匹配所有以
.html结尾的请求,就填写*.html。 - 忽略大小写:勾选此项,这样
index.HTML和index.html都会被匹配。
- 模式:这里填写你想要匹配的 URL 格式,如果你想匹配所有以
- 条件:(可选) 如果需要更精确的控制,可以添加条件,可以添加一个条件,检查请求的文件是否真实存在,如果存在则不重写,避免重复处理。
- 操作:
- 操作类型:选择 “重写”。
- URL:填写重写后的真实路径,这里使用
{R:1}来引用模式中第一个捕获组,因为我们模式是*.html,{R:1}就是文件名部分(about),重写后的 URL{R:1}.php。 - 查询字符串:选择“将查询字符串追加到 URL”,这样
page.html?id=123会被重写为page.php?id=123。 - 跟踪 URL:选择“否”。
- 名称:给规则起一个有意义的名字,
-
点击 “应用” 保存规则。
示例配置:
- 模式:
*.html - 操作类型: 重写
- URL:
{R:1}.php
效果:
用户访问 http://www.yoursite.com/about.html,IIS 会将其内部重写为 http://www.yoursite.com/about.php 来处理,但用户浏览器地址栏的 URL 仍然是 about.html。
将路径式 URL 重写为带查询参数的动态 URL(常见于 WordPress, Discuz! 等程序)
这是更典型的伪静态场景,例如将 post/123 重写为 index.php?p=123。
操作步骤:
-
同样,在 IIS 管理器中打开你网站的“URL 重写”功能。
-
点击 “添加规则...” -> “入站规则”。
-
在“编辑入站规则”窗口中,进行如下设置:
- 名称:
Rewrite Pretty URL。 - 匹配的 URL:
- 模式:填写你想要匹配的路径格式,匹配
post/后面跟任意数字的路径,可以使用正则表达式:^post/(\d+)$。^表示字符串开始。post/是固定的路径。(\d+)是一个捕获组,\d代表数字, 代表一个或多个。- 表示字符串结束。
- 模式:填写你想要匹配的路径格式,匹配
- 条件:(可选) 可以添加条件,确保请求的不是真实存在的文件或目录,以避免与实际存在的静态资源冲突。
- 输入:
{REQUEST_FILENAME} - 类型:
IsFile - 检查 if 输入与模式匹配: 勾选此项
- 模式:
- 忽略大小写: 勾选
- 负向: 勾选此项 (这个条件非常重要!它的意思是:如果请求的是一个真实存在的文件,则此规则不执行。)
- 输入:
- 操作:
- 操作类型:选择 “重写”。
- URL:填写重写后的真实路径,这里我们使用
index.php,并通过查询字符串传递参数,格式为index.php?p={C:1},{C:1}引用了第一个捕获组(即(\d+)匹配到的数字)。 - 查询字符串:选择“将查询字符串追加到 URL”。
- 跟踪 URL:选择“否”。
- 名称:
-
点击 “应用” 保存规则。
示例配置:
- 模式:
^post/(\d+)$ - 条件:
- 输入:
{REQUEST_FILENAME} - 类型:
IsFile - 模式:
- 负向: 勾选
- 输入:
- 操作类型: 重写
- URL:
index.php?p={C:1}
效果:
用户访问 http://www.yoursite.com/post/123,IIS 会将其内部重写为 http://www.yoursite.com/index.php?p=123 来处理。
第三步:处理 404 错误(非常重要!)
当你配置了伪静态后,如果重写后的目标文件(如 index.php)不存在,IIS 会返回一个标准的 404 错误页面,这非常不友好。
为了解决这个问题,你需要配置一个自定义的错误页面,让它指向你的动态脚本(通常是 index.php),让脚本去处理所有未找到的请求。
操作步骤:
- 在 IIS 管理器中,选择你的网站。
- 双击打开 “错误页” 功能。
- 在右侧“操作”面板,点击 “添加...”。
- 在弹出的窗口中:
- 错误代码: 输入
404。 - 路径: 输入你的动态脚本路径,
/index.php,或者,如果你使用的是更通用的处理方式,可以输入一个专门处理 404 的页面,如/404.php。 - 响应动作: 选择 “执行 URL”,这表示 IIS 会将请求重定向到
index.php,而不是直接返回index.php的内容。
- 错误代码: 输入
- 点击 “确定” 保存。
为什么执行 URL 比直接返回内容更好?
“执行 URL” 是一个子请求,服务器会再次运行 index.php 脚本,你的 index.php 代码可以检查 $_SERVER['REQUEST_URI'] 或 $_SERVER['REDIRECT_URL'] 变量,获取用户最初请求的 URL(如 /post/123),然后根据这个路径来决定显示什么内容(显示文章 123),这样,你就可以在 404 页面中展示更智能的错误处理或内容查找。
常见程序 IIS 伪静态规则示例
很多成熟的程序(如 WordPress, Discuz!)都提供了官方的 IIS 重写规则,你只需要找到对应的规则文件并导入即可。
WordPress
WordPress 官方提供了 web.config 文件,包含了所有必要的重写规则。
- 下载 WordPress 并解压。
- 在解压后的根目录下,你会找到一个名为
web.config的文件。 - 将这个文件直接上传到你的网站根目录即可,它会自动处理所有 URL 重写。
Discuz!
Discuz! 的规则通常在 config/config_ucenter.php 或官方文档中提供,格式如下,你需要手动创建一个 web.config 文件并添加这些规则。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite Forum">
<match url="^(.*/)?(forum|forum|thread|post|topic)(.*)\.html\?*(.*)$" />
<action type="Rewrite" url="{R:1}/index.php\?{R:2}{R:3}&{R:4}" />
</rule>
<rule name="Rewrite Portal">
<match url="^(.*/)?(portal|forum|home|group|)(.*)\.html\?*(.*)$" />
<action type="Rewrite" url="{R:1}/index.php\?{R:2}{R:3}&{R:4}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
总结与排查
- 检查模块:确保 URL Rewrite 模块已安装并重启 IIS。
- 检查规则:仔细检查规则的“模式”和“操作”中的 URL 是否正确,特别是捕获组
{R:1},{C:1}的使用。 - 检查权限:确保
web.config文件和网站目录有正确的 IIS_IUSRS 或 Users 读取和执行权限。 - 使用工具:IIS 的 URL Rewrite 模块自带一个“测试模式”功能,你可以输入一个 URL 来测试规则是否能被正确匹配和重写,非常方便。
- 查看日志:如果规则不生效,可以查看 IIS 的失败请求跟踪日志,或者开启 PHP 的错误报告,看是否有相关错误信息。
通过以上步骤,你就可以成功地在 IIS 网站上实现伪静态配置了。
