目录

  1. 什么是伪静态?为什么需要它?
  2. httpd.ini 文件是什么?
  3. 准备工作:IIS 安装 URL Rewrite 模块
  4. httpd.ini 文件基础语法
  5. 实战演练:为不同程序配置伪静态
    • WordPress
    • Typecho
    • Discuz!
    • 通用 PHP 程序(如文章详情页)
  6. 如何部署 httpd.ini 文件?
  7. 常见问题与排查
  8. 安全建议

什么是伪静态?为什么需要它?

伪静态(Pseudo-static)是一种通过服务器重写 URL 规则,将动态网页的地址(如 index.php?id=123)伪装成静态网页地址(如 post/123.html)的技术。

httpd.ini 伪静态教程
(图片来源网络,侵删)

优点:

  • 对搜索引擎友好 (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 伪静态教程
(图片来源网络,侵删)

注意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 的规则。

  1. 下载 URL Rewrite Module

  2. 安装

    • 下载后是一个 .msi 安装包,双击运行,按照提示完成安装即可。
  3. 验证安装

    • 打开 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 下的伪静态规则非常经典。

目标 URLhttps://example.com/hello-world/ 真实 URLhttps://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]

规则解析

  1. RewriteRule /wp-admin(/.*)? /wp-admin/$1 [L]:如果请求路径以 /wp-admin 开头,直接访问,不做重写。
  2. RewriteCond %{REQUEST_FILENAME} -f [OR]:如果请求的是一个真实存在的文件...
  3. RewriteCond %{REQUEST_FILENAME} -d:...或者是一个真实存在的目录...
  4. RewriteRule . - [L]:...则不做任何重写,直接访问,这个条件非常重要,可以避免对图片、CSS、JS 等静态文件进行不必要的重写。
  5. 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]

规则解析

  1. RewriteRule ^(.*)(html|htm)$ /index.php/$1 [L]:将所有以 .html.htm 结尾的请求,重写到 /index.php/ 后面。
  2. RewriteCond %{REQUEST_FILENAME} !-f:如果请求的不是一个真实文件...
  3. RewriteCond %{REQUEST_FILENAME} !-d:...也不是一个真实目录...
  4. 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

目标 URLhttps://example.com/article/123.html 真实 URLhttps://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 文件后,需要将其上传到你的网站根目录下。

  1. 创建文件:在你的电脑上,用记事本或其他文本编辑器创建一个名为 httpd.ini 的文件。
  2. 粘贴规则:将上面示例中的相应规则复制粘贴到文件中。
  3. 保存:保存文件,确保编码为 ANSI 或 UTF-8 without BOM,避免出现乱码。
  4. 上传:通过 FTP 或文件管理器,将 httpd.ini 文件上传到你网站的根目录(即 public_htmlwwwroothttpdocs 目录)。
  5. 设置权限:确保 httpd.ini 文件的权限可读(通常是 644)。

上传后,IIS 服务器会自动加载并应用这些规则,你可以通过访问伪静态的 URL 来测试是否生效。


常见问题与排查

  • 404 Not Found 错误

    • 原因:规则不正确,导致重写到了一个不存在的文件或路径。
    • 排查
      1. 检查 httpd.ini 中的路径是否正确。
      2. 检查 RewriteCond 条件是否过于严格或宽松。
      3. 使用浏览器的开发者工具(F12)查看网络请求,看看实际请求的 URL 是什么。
  • 500 Internal Server Error 错误

    • 原因httpd.ini 文件语法错误,例如正则表达式写错、括号不匹配等。
    • 排查
      1. 检查文件中是否有语法错误,可以先清空文件内容,只留 [ISAPI_Rewrite],看是否恢复正常。
      2. 逐条添加规则,测试是哪一条规则导致了错误。
  • 规则不生效

    • 原因:IIS 服务器没有正确加载 httpd.ini 文件。
    • 排查
      1. 确认 httpd.ini 文件已上传到正确的网站根目录。
      2. 确认你使用的是支持 httpd.ini 的组件(如 ISAPI_Rewrite 3),而不是 URL Rewrite Module,URL Rewrite Module 使用 web.config
      3. 如果使用 URL Rewrite Module,你需要将 httpd.ini 规则转换为 web.config 格式,可以使用在线转换工具。
  • 静态文件(CSS, JS, 图片)无法加载

    • 原因:你的重写规则过于宽泛,将静态文件的请求也重写到了 PHP 脚本。
    • 排查
      • 解决方案:在所有 RewriteRule 之前,添加以下条件判断,确保只有对非真实文件/目录的请求才进行重写。
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule . - [L]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule . - [L]

        这两条规则应该放在你主要的重写规则之前。


安全建议

  • 限制重写范围:尽量避免使用 RewriteRule . /index.php [L] 这种过于宽泛的规则,尽量使用更精确的正则表达式来匹配需要伪静态的路径。
  • 备份配置文件:在修改 httpd.ini 之前,最好备份一份原始文件,以便出错时可以快速恢复。
  • 使用官方模块:如前所述,对于新项目,优先考虑使用微软官方的 URL Rewrite Moduleweb.config 文件,因为它更稳定、更安全,并且与 IIS 集成得更好,你可以使用在线工具将 httpd.ini 规则转换为 web.config 规则。

希望这份详细的教程能帮助你成功配置 httpd.ini 伪静态!