凌峰创科服务平台

IIS伪静态规则如何配置?

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

IIS伪静态规则如何配置?-图1
(图片来源网络,侵删)

第一步:安装 URL Rewrite 模块

这是所有配置的前提,如果你的 IIS 没有安装此模块,将无法进行后续操作。

  1. 下载模块

    • 访问微软官方下载页面:URL Rewrite Module
    • 根据你的服务器操作系统(32位或64位)下载相应的安装包,通常服务器都是 64 位,下载 x64 版本即可。
  2. 安装模块

    • 下载后,双击运行安装程序,安装过程非常简单,基本上就是“下一步”直到完成。
    • 安装完成后,需要重启 IIS 服务 或重启服务器才能生效,重启 IIS 的方法:
      • 打开命令提示符(管理员身份)。
      • 输入命令:iisreset 并回车。
  3. 验证安装

    IIS伪静态规则如何配置?-图2
    (图片来源网络,侵删)
    • 打开 IIS 管理器
    • 在左侧的“管理”区域,你应该能看到一个名为 “URL 重写” 的图标,这表示模块已成功安装。

第二步:配置伪静态规则

安装好模块后,我们就可以为具体的网站配置重写规则了,这里我们分两种最常见的情况:

.html 或其他静态后缀的请求重写为 .php 文件(常见于 PHP 网站)

这种规则的目的是为了让用户访问 about.html 时,实际上服务器执行的是 about.php 文件,但 URL 保持美观。

操作步骤

  1. 在 IIS 管理器中,选择你想要配置的网站。

    IIS伪静态规则如何配置?-图3
    (图片来源网络,侵删)
  2. 双击打开 “URL 重写” 功能。

  3. 在右侧的“操作”面板中,点击 “添加规则...”

  4. 在弹出的“添加规则”窗口中,选择 “入站规则”,然后点击“确定”。

  5. 在“编辑入站规则”窗口中,进行如下设置:

    • 名称:给规则起一个有意义的名字,Rewrite HTML to PHP
    • 匹配的 URL
      • 模式:这里填写你想要匹配的 URL 格式,如果你想匹配所有以 .html 结尾的请求,就填写 *.html
      • 忽略大小写:勾选此项,这样 index.HTMLindex.html 都会被匹配。
    • 条件:(可选) 如果需要更精确的控制,可以添加条件,可以添加一个条件,检查请求的文件是否真实存在,如果存在则不重写,避免重复处理。
    • 操作
      • 操作类型:选择 “重写”
      • URL:填写重写后的真实路径,这里使用 {R:1} 来引用模式中第一个捕获组,因为我们模式是 *.html{R:1} 就是文件名部分(about),重写后的 URL {R:1}.php
      • 查询字符串:选择“将查询字符串追加到 URL”,这样 page.html?id=123 会被重写为 page.php?id=123
      • 跟踪 URL:选择“否”。
  6. 点击 “应用” 保存规则。

示例配置

  • 模式: *.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

操作步骤

  1. 同样,在 IIS 管理器中打开你网站的“URL 重写”功能。

  2. 点击 “添加规则...” -> “入站规则”

  3. 在“编辑入站规则”窗口中,进行如下设置:

    • 名称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:选择“否”。
  4. 点击 “应用” 保存规则。

示例配置

  • 模式: ^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),让脚本去处理所有未找到的请求。

操作步骤

  1. 在 IIS 管理器中,选择你的网站。
  2. 双击打开 “错误页” 功能。
  3. 在右侧“操作”面板,点击 “添加...”
  4. 在弹出的窗口中:
    • 错误代码: 输入 404
    • 路径: 输入你的动态脚本路径,/index.php,或者,如果你使用的是更通用的处理方式,可以输入一个专门处理 404 的页面,如 /404.php
    • 响应动作: 选择 “执行 URL”,这表示 IIS 会将请求重定向到 index.php,而不是直接返回 index.php 的内容。
  5. 点击 “确定” 保存。

为什么执行 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 文件,包含了所有必要的重写规则。

  1. 下载 WordPress 并解压。
  2. 在解压后的根目录下,你会找到一个名为 web.config 的文件。
  3. 将这个文件直接上传到你的网站根目录即可,它会自动处理所有 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 网站上实现伪静态配置了。

分享:
扫描分享到社交APP
上一篇
下一篇