目录
- 什么是伪静态?为什么需要它?
httpd.ini文件是什么?- 准备工作:IIS 安装 URL Rewrite 模块
httpd.ini文件基础语法- 实战演练:为不同程序配置伪静态
- WordPress
- Typecho
- Discuz!
- 通用 PHP 程序(如文章详情页)
- 如何部署
httpd.ini文件? - 常见问题与排查
- 安全建议
什么是伪静态?为什么需要它?
伪静态(Pseudo-static)是一种通过服务器重写 URL 规则,将动态网页的地址(如 index.php?id=123)伪装成静态网页地址(如 post/123.html)的技术。

优点:
- 对搜索引擎友好 (SEO):静态 URL 结构清晰、稳定,更容易被搜索引擎(如 Google、百度)抓取和索引,有助于提高网站排名。
- 用户体验更佳:URL 更短、更直观,用户更容易理解和记忆,也方便分享。
- 隐藏技术实现:可以隐藏网站使用的是哪种编程语言(如 PHP、ASP),增加一定的安全性。
- 可能改善服务器性能:在某些情况下,减少动态脚本的执行开销,但这一点有争议,SEO 是主要目的。
与真静态的区别:
- 真静态:每次访问时,服务器会动态生成一个真实的 HTML 文件并保存到服务器上,用户访问这个 HTML 文件,服务器不执行 PHP 等脚本,优点是访问速度快,但缺点是占用磁盘空间,且内容更新后需要重新生成。
- 伪静态:URL 看起来是静态的,但服务器内部依然会执行 PHP 脚本,从数据库获取数据并生成页面,URL 是“伪装”的,优点是节省磁盘空间,内容实时更新,但每次访问都需要执行脚本,对服务器性能有一定要求。
httpd.ini 文件是什么?
httpd.ini 是 IIS 服务器(配合 ISAPI_Rewrite 组件)的伪静态规则配置文件,它的作用类似于 Apache 服务器中的 .htaccess 文件。
当你访问一个“伪静态”的 URL 时,IIS 服务器会首先加载 httpd.ini 文件,根据里面的规则,将用户请求的 URL 重写(Rewrite)成服务器能够识别的真实动态地址。

注意:httpd.ini 通常与 ISAPI_Rewrite 组件配合使用,而不是微软官方的 URL Rewrite Module,但两者功能类似,URL Rewrite Module 使用的是 web.config 文件,本教程重点讲解 httpd.ini 的使用。
准备工作:IIS 安装 URL Rewrite 模块
如果你的服务器是 Windows Server 2008 或更高版本,强烈建议使用微软官方的 URL Rewrite Module,它功能更强大,且持续更新。httpd.ini 的规则可以很容易地转换成 web.config 的规则。
-
下载 URL Rewrite Module:
- 访问微软官方下载页面:https://www.iis.net/downloads/microsoft/url-rewrite
- 根据你的服务器系统(32位或64位)下载对应的版本。
-
安装:
- 下载后是一个
.msi安装包,双击运行,按照提示完成安装即可。
- 下载后是一个
-
验证安装:
- 打开 IIS 管理器。
- 在左侧的“连接”面板中,选中你的网站。
- 在中间的“功能视图”中,你应该能看到一个名为 “URL 重写” 的图标,如果看到,说明安装成功。
httpd.ini 文件基础语法
httpd.ini 文件由 规则 组成,每个规则以 [ISAPI_Rewrite] 开头,后面跟着具体的重写指令。
核心指令
-
RewriteRule:定义一条重写规则,是最常用的指令。- 语法:
RewriteRule 模式 替换字符串 [选项] - 模式:一个正则表达式,用于匹配用户请求的 URL。
- 替换字符串:当 URL 匹配成功后,将被重写成的真实路径。
- 选项:如
L(Last, 最后一条规则)、NC(No Case, 不区分大小写) 等。
- 语法:
-
RewriteCond:重写条件,通常放在RewriteRule之前,表示只有当满足这个条件时,RewriteRule才会生效。- 语法:
RewriteCond 测试模式 条件 [选项] - 测试模式:一个正则表达式,用于测试服务器的变量(如
REQUEST_FILENAME请求的文件路径,QUERY_STRING查询字符串等)。 - 条件:可以是正则表达式、字符串比较等。
- 语法:
常用选项
L(Last):表示这是最后一条匹配的规则,如果匹配成功,则停止后续规则的匹配。NC(No Case):表示不区分大小写进行匹配。QSA(Query String Append):如果原 URL 带有查询参数(如?id=123),这个选项会将参数追加到重写后的 URL 后面。
常用变量
REQUEST_FILENAME:服务器上请求文件的完整物理路径。REQUEST_URI:用户请求的完整 URI,不包含域名。HTTP_HOST:用户请求的主机名(域名)。
实战演练:为不同程序配置伪静态
示例 1:WordPress
WordPress 在 IIS 下的伪静态规则非常经典。
目标 URL:https://example.com/hello-world/
真实 URL:https://example.com/index.php?p=123
httpd.ini 规则:
[ISAPI_Rewrite]
# WordPress 规则
# 确保文件或目录真实存在时,不进行重写
RewriteRule /wp-admin(/.*)? /wp-admin/$1 [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
# 将所有其他请求重写到 index.php
RewriteRule . /index.php [L]
规则解析:
RewriteRule /wp-admin(/.*)? /wp-admin/$1 [L]:如果请求路径以/wp-admin开头,直接访问,不做重写。RewriteCond %{REQUEST_FILENAME} -f [OR]:如果请求的是一个真实存在的文件...RewriteCond %{REQUEST_FILENAME} -d:...或者是一个真实存在的目录...RewriteRule . - [L]:...则不做任何重写,直接访问,这个条件非常重要,可以避免对图片、CSS、JS 等静态文件进行不必要的重写。RewriteRule . /index.php [L]:如果以上条件都不满足(即请求的不是真实文件或目录),则将所有请求都重写到根目录下的index.php文件,WordPress 会根据这个请求来解析出正确的页面。
示例 2:Typecho
Typecho 的规则和 WordPress 类似,但目标文件是 index.php。
httpd.ini 规则:
[ISAPI_Rewrite]
# Typecho 规则
RewriteRule ^(.*)(html|htm)$ /index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
规则解析:
RewriteRule ^(.*)(html|htm)$ /index.php/$1 [L]:将所有以.html或.htm结尾的请求,重写到/index.php/后面。RewriteCond %{REQUEST_FILENAME} !-f:如果请求的不是一个真实文件...RewriteCond %{REQUEST_FILENAME} !-d:...也不是一个真实目录...RewriteRule . /index.php [L]:...则将所有请求重写到index.php。
示例 3:Discuz!
Discuz! 的规则比较复杂,需要处理多种情况。
httpd.ini 规则:
[ISAPI_Rewrite]
# Discuz! 规则
# 确保文件或目录真实存在时,不进行重写
RewriteRule ^(.*)(html|htm)$ /$1 [I,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)(\?.*)$ /$1 [I,L]
RewriteRule ^(.*)$ /index.php [I,L]
示例 4:通用 PHP 程序(文章详情页)
假设你的网站文章详情页动态地址是 article.php?id=123,希望伪静态为 article/123.html。
目标 URL:https://example.com/article/123.html
真实 URL:https://example.com/article.php?id=123
httpd.ini 规则:
[ISAPI_Rewrite] # 通用文章页伪静态 RewriteRule ^article/(\d+)\.html$ /article.php?id=$1 [L,NC,QSA]
规则解析:
^article/(\d+)\.html$:匹配以article/开头,后面是一串数字(\d+),最后是.html结尾的 URL。/article.php?id=$1:将匹配到的数字($1代表第一个捕获组)作为id参数,重写到article.php。[L,NC,QSA]:L:匹配到后不再执行后续规则。NC:不区分大小写,Article/123.html也能匹配。QSA:如果用户访问article/123.html?from=somepage,?from=somepage会被保留并传递给article.php。
如何部署 httpd.ini 文件?
配置好 httpd.ini 文件后,需要将其上传到你的网站根目录下。
- 创建文件:在你的电脑上,用记事本或其他文本编辑器创建一个名为
httpd.ini的文件。 - 粘贴规则:将上面示例中的相应规则复制粘贴到文件中。
- 保存:保存文件,确保编码为 ANSI 或 UTF-8 without BOM,避免出现乱码。
- 上传:通过 FTP 或文件管理器,将
httpd.ini文件上传到你网站的根目录(即public_html、wwwroot或httpdocs目录)。 - 设置权限:确保
httpd.ini文件的权限可读(通常是 644)。
上传后,IIS 服务器会自动加载并应用这些规则,你可以通过访问伪静态的 URL 来测试是否生效。
常见问题与排查
-
404 Not Found 错误:
- 原因:规则不正确,导致重写到了一个不存在的文件或路径。
- 排查:
- 检查
httpd.ini中的路径是否正确。 - 检查
RewriteCond条件是否过于严格或宽松。 - 使用浏览器的开发者工具(F12)查看网络请求,看看实际请求的 URL 是什么。
- 检查
-
500 Internal Server Error 错误:
- 原因:
httpd.ini文件语法错误,例如正则表达式写错、括号不匹配等。 - 排查:
- 检查文件中是否有语法错误,可以先清空文件内容,只留
[ISAPI_Rewrite],看是否恢复正常。 - 逐条添加规则,测试是哪一条规则导致了错误。
- 检查文件中是否有语法错误,可以先清空文件内容,只留
- 原因:
-
规则不生效:
- 原因:IIS 服务器没有正确加载
httpd.ini文件。 - 排查:
- 确认
httpd.ini文件已上传到正确的网站根目录。 - 确认你使用的是支持
httpd.ini的组件(如 ISAPI_Rewrite 3),而不是 URL Rewrite Module,URL Rewrite Module 使用web.config。 - 如果使用 URL Rewrite Module,你需要将
httpd.ini规则转换为web.config格式,可以使用在线转换工具。
- 确认
- 原因:IIS 服务器没有正确加载
-
静态文件(CSS, JS, 图片)无法加载:
- 原因:你的重写规则过于宽泛,将静态文件的请求也重写到了 PHP 脚本。
- 排查:
- 解决方案:在所有
RewriteRule之前,添加以下条件判断,确保只有对非真实文件/目录的请求才进行重写。RewriteCond %{REQUEST_FILENAME} -f RewriteRule . - [L] RewriteCond %{REQUEST_FILENAME} -d RewriteRule . - [L]这两条规则应该放在你主要的重写规则之前。
- 解决方案:在所有
安全建议
- 限制重写范围:尽量避免使用
RewriteRule . /index.php [L]这种过于宽泛的规则,尽量使用更精确的正则表达式来匹配需要伪静态的路径。 - 备份配置文件:在修改
httpd.ini之前,最好备份一份原始文件,以便出错时可以快速恢复。 - 使用官方模块:如前所述,对于新项目,优先考虑使用微软官方的 URL Rewrite Module 和
web.config文件,因为它更稳定、更安全,并且与 IIS 集成得更好,你可以使用在线工具将httpd.ini规则转换为web.config规则。
希望这份详细的教程能帮助你成功配置 httpd.ini 伪静态!
