Windows Server下IIS Manager URL重写规则需求:URL不变显示指定页面
在Windows Server上实现URL内部重写(地址栏保持不变)
针对你需要让用户访问www.example.org/placestorun时,显示www.example.org/placrun的内容但地址栏不变化的需求,在Windows Server环境下最主流的实现方式是通过IIS的URL Rewrite模块来完成内部重写,具体步骤如下:
一、安装IIS URL Rewrite模块
- 打开服务器管理器,选择「添加角色和功能」,在Web服务器(IIS)的角色服务中找到「URL Rewrite」并勾选安装;
- 也可以直接从微软官方渠道下载对应Windows Server版本的URL Rewrite模块安装包进行手动安装。
二、配置重写规则(两种方式)
方式1:通过IIS图形界面配置
- 打开IIS管理器,定位到
www.example.org对应的目标站点; - 在右侧功能视图中找到「URL Rewrite」并双击进入;
- 点击右侧「添加规则」,选择「空白规则」后点击确定;
- 在规则编辑页面完成以下设置:
- 规则名称:自定义一个易识别的名字,比如「placestorun内部重写」;
- 匹配URL:
- 请求的URL:选择「与模式匹配」;
- 使用:选择「正则表达式」;
- 模式:填写
^placestorun$(如果需要支持带参数的场景,比如placestorun?id=123,可改成^placestorun(.*)$);
- 条件:保持默认配置即可,无需额外添加;
- 操作:
- 操作类型:选择「重写」;
- 重写URL:填写
placrun(支持参数的场景下填写placrun{R:1},{R:1}会匹配正则中的(.*)部分,保留参数和路径后缀); - 追加查询字符串:勾选「是」,确保请求参数能正常传递;
- 点击「应用」保存规则。
方式2:直接修改web.config文件
如果你习惯通过配置文件操作,可以直接在网站根目录的web.config中添加以下配置(没有该文件的话新建一个即可):
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 基础版本:匹配不带参数的placestorun --> <rule name="Internal Rewrite placestorun to placrun" stopProcessing="true"> <match url="^placestorun$" /> <action type="Rewrite" url="placrun" appendQueryString="true" /> </rule> <!-- 带参数版本:支持placestorun?xxx=xxx或placestorun/xxx这类路径 --> <!-- <rule name="Internal Rewrite placestorun with params" stopProcessing="true"> <match url="^placestorun(.*)$" /> <action type="Rewrite" url="placrun{R:1}" appendQueryString="true" /> </rule> --> </rules> </rewrite> </system.webServer> </configuration>
- 注释部分是支持参数的版本,根据你的需求选择启用即可;
stopProcessing="true"表示匹配到该规则后不再处理后续规则,避免规则冲突;appendQueryString="true"确保请求中的查询字符串能被传递到目标页面。
三、验证配置
配置完成后,直接在浏览器访问www.example.org/placestorun,你会发现地址栏保持不变,但页面内容已经是placrun页面的内容了。如果遇到403/404错误,检查以下几点:
- 确认
placrun页面本身存在且可正常访问; - 确保IIS应用程序池的身份有访问
placrun相关文件的权限; - 检查URL Rewrite规则的正则表达式是否正确匹配请求路径。
如果你的Windows Server上使用的是Apache作为Web服务器,也可以通过mod_rewrite模块实现,在网站根目录的.htaccess文件中添加以下规则:
RewriteEngine On # 基础匹配 RewriteRule ^placestorun$ placrun [L] # 带参数匹配 # RewriteRule ^placestorun(.*)$ placrun$1 [L]
内容的提问来源于stack exchange,提问作者sjw0525




