iis Url重写配置官方文档地址:https://learn.microsoft.com/zh-cn/iis/extensions/url-rewrite-module/using-the-url-rewrite-module
官方给出的可用的服务器变量有
服务器变量 | 说明 |
---|---|
ALL_HTTP | 客户端发送的所有 HTTP 标头。 标头的前缀为 HTTP_ 和大写。 例如: HTTP_ACCEPT_ENCODING:gzip, deflate, br |
ALL_RAW | 客户端以原始格式发送的所有 HTTP 标头。 例如: Accept-Encoding: gzip, deflate, br |
APPL_MD_PATH | 应用程序的元数据库路径。 |
APPL_PHYSICAL_PATH | 应用程序的物理路径。 |
APP_POOL_CONFIG | 临时 IIS 应用程序池配置的物理路径。 |
APP_POOL_ID | 运行处理请求的 IIS 工作进程的应用程序池的名称。 |
AUTH_PASSWORD | 客户端提供的密码,用于使用基本身份验证进行身份验证。 |
AUTH_TYPE | 服务器用于验证用户的身份验证方法。 这并不意味着如果AUTH_TYPE包含值并且身份验证方案不是基本或集成Windows 身份验证,则表示用户已经过身份验证。 服务器允许它本身不支持的身份验证方案,因为 ISAPI 筛选器可能能够处理该特定方案。 |
AUTH_USER | 在将用户名映射到 Windows 帐户之前,从客户端发送的授权标头派生的用户名。 此变量与REMOTE_USER没有什么不同。 如果在 Web 服务器上安装了将传入用户映射到帐户的身份验证筛选器,请使用 LOGON_USER 查看映射的用户名。 |
CACHE_URL | 仅用于 ISAPI 应用程序。 返回当前 URL 的明确名称。 有必要将此变量的 Unicode 版本与内核模式缓存失效函数结合使用,以便通过HSE_REQ_VECTOR_SEND逐出放置在缓存中的条目。 |
CERT_COOKIE | 客户端证书的唯一 ID,以字符串的形式返回。 这可以用作整个客户端证书的签名。 |
CERT_FLAGS | 如果存在客户端证书,则 bit0 设置为 1。 如果客户端证书的证书颁发机构无效,则 bit0 设置为 1, (即,它不在服务器) 上已识别的证书颁发机构列表中。 如果CERT_FLAGS的第 1 位设置为 1,指示证书无效,则 IIS 版本 4.0 及更高版本将拒绝该证书。 早期版本的 IIS 不会拒绝证书。 |
CERT_ISSUER | 客户端证书的颁发者字段。 |
CERT_KEYSIZE | SSL/TLS 连接密钥大小的位数。 |
CERT_SECRETKEYSIZE | SSL/TLS 服务器私钥中的位数。 |
CERT_SERIALNUMBER | 客户端证书的序列号。 |
CERT_SERVER_ISSUER | 服务器证书的颁发者字段。 |
CERT_SERVER_SUBJECT | 服务器证书的接受方字段。 |
CERT_SUBJECT | 客户证书的接受方字段。 |
CONTENT_LENGTH | 请求正文的长度。 |
CONTENT_TYPE | 请求正文的 MIME 类型。 用于具有附加信息的查询,例如 GET、 POST 和 PUT。 |
CRYPT_CIPHER_ALG_ID | 用于建立连接的加密加密算法。 算法的十六进制值在 ALG_ID数据类型中建立。 例如,256 位 AES (CALG_AES_256) 将为 6610。 |
CRYPT_HASH_ALG_ID | 用于 (MAC) 生成消息身份验证代码的哈希算法。 算法的十六进制值在 ALG_ID数据类型中建立。 例如,MD5 (CALG_MD5) 将为 8003。 |
CRYPT_KEYEXCHANGE_ALG_ID | 用于建立连接的密钥交换算法。 算法的十六进制值在 ALG_ID数据类型中建立。 例如,密钥交换算法Diffie-Hellman椭圆曲线 (CALG_ECDH) 将为 aa05。 |
CRYPT_PROTOCOL | 用于建立连接的加密协议。 协议的十六进制值是在 SecPkgContext_ConnectionInfo结构中建立的。 例如, TLS 1.2 将为 400。 |
DOCUMENT_ROOT | IIS 网站的目录的物理路径。 |
FORWARDED_URL | 转发的 URL。 |
GATEWAY_INTERFACE | 服务器使用的 CGI 规范的修订版。 格式为 CGI/revision。 |
HTTPS | 如果请求通过安全通道 ((例如 SSL) )传入,则返回 ON ;或者,如果请求针对不安全的通道,则返回 OFF。 |
HTTPS_KEYSIZE | SSL/TLS 连接密钥大小的位数。 |
HTTPS_SECRETKEYSIZE | 服务器证书私钥中的位数。 |
HTTPS_SERVER_ISSUER | 服务器证书的颁发者字段。 |
HTTPS_SERVER_SUBJECT | 服务器证书的使用者字段。 |
HTTP_METHOD | 用于发出请求的方法。 |
HTTP_URL | 原始编码 URL。 例如: /vdir/default.aspx?querystring |
HTTP_VERSION | 请求协议的名称和版本 (原始形式的SERVER_PROTOCOL) 。 |
INSTANCE_ID | IIS 站点 ID。 |
INSTANCE_META_PATH | 响应请求的 IIS 实例的元数据库路径。 |
INSTANCE_NAME | IIS 站点名称。 |
LOCAL_ADDR | 请求传入的服务器地址。 这一点对于可能有多个 IP 地址绑定到计算机的计算机上非常重要,并且你想要找出请求使用的地址。 |
LOGON_USER | 用户在连接到 Web 服务器时模拟的 Windows 帐户。 使用 REMOTE_USER、 UNMAPPED_REMOTE_USER或 AUTH_USER 查看请求标头中包含的原始用户名。 唯一LOGON_USER包含的值与这些其他变量不同的是,是否安装了身份验证筛选器。 |
MANAGED_PIPELINE_MODE | 运行处理请求的 IIS 辅助进程的应用程序池的托管管道模式。 |
PATH_INFO | 客户端提供的路径信息,例如 /vdir/myisapi.dll/zip。 如果此信息来自 URL,则服务器在将其传递到 CGI 脚本或 ISAPI 筛选器之前对其进行解码。 如果 AllowPathInfoForScriptMappings 元数据库属性设置为 true (以支持独占 CGI 功能) , 则PATH_INFO 将仅包含 /zip 并且 ASP 等 ISAPI 应用程序将中断。 |
PATH_TRANSLATED | 映射到 PATH_INFO 中的虚拟路径的物理路径, c:\inetpub\wwwroot\vdir\myisapi.dll例如 。 IIS 在处理 ISAPI 应用程序期间使用此变量。 如果 AllowPathInfoForScriptMappings 元数据库属性设置为 true (以支持) 的独占 CGI 功能,则PATH_INFO将仅包含 /zip 并且 ASP 等 ISAPI 应用程序将中断。 |
QUERY_STRING | HTTP 请求中问号 (?) 后,字符串中存储的查询信息。 |
REMOTE_ADDR | 发出请求的远程主机的 IP 地址。 |
REMOTE_HOST | 发出请求的主机的名称。 如果服务器没有此信息,它将设置REMOTE_ADDR并将此保留为空。 |
REMOTE_PORT | TCP 连接的客户端端口号。 |
REMOTE_USER | 在将用户名映射到 Windows 帐户之前,从客户端发送的授权标头派生的用户的名称。 如果在 Web 服务器上安装了将传入用户映射到帐户的身份验证筛选器,请使用 LOGON_USER 查看映射的用户名。 |
REQUEST_FILENAME | 当前请求的物理路径。 |
REQUEST_FLAGS | HTTP_REQUEST标志。 例如, HTTP_REQUEST_FLAG_HTTP2 将为 HTTP/2 请求设置 标志。 |
REQUEST_METHOD | 用于发出请求的方法。 |
REQUEST_URI | URI 的绝对路径部分。 例如 https://contoso.com:8042/over/there?name=ferret ,将返回 /over/there |
SCRIPT_FILENAME | 当前请求的物理路径。 |
SCRIPT_NAME | 要执行的脚本的虚拟路径。 |
SCRIPT_TRANSLATED | 请求文件的 扩展长度路径 (前缀 \\?\) 。 |
SERVER_ADDR | 站点绑定到的 IP 地址。 |
SERVER_NAME | 服务器的主机名、DNS 别名或 IP 地址,因为它将显示在自引用 URL 中。 |
SERVER_PORT | 请求发送到的服务器端口号。 |
SERVER_PORT_SECURE | 包含 或 1的0字符串。 如果在安全端口上处理请求,则为 1。 否则为 0。 |
SERVER_PROTOCOL | 请求信息协议的名称和修订。 格式为协议/修订。 (HTTP_VERSION.) 规范化形式 |
SERVER_SOFTWARE | 响应请求并运行网关的服务器软件的名称和版本。 格式为名称/版本。 |
UNENCODED_URL | 原始未编码 URL。 |
UNMAPPED_REMOTE_USER | 在将用户名映射到 Windows 帐户之前,从客户端发送的授权标头派生的用户的名称 (与 REMOTE_USER) 相同。 如果在 Web 服务器上安装了将传入用户映射到帐户的身份验证筛选器,请使用 LOGON_USER 查看映射的用户名。 |
URL | URL 的基部分,没有任何查询字符串信息。 |
官方给出的匹配条件有(不全)
匹配条件设置有个技巧,除了官方给的这些key外,匹配条件可以自定义匹配header中的值。写法为:{HTTP_HeaderName}
例如在匹配 X-Forwarded-Proto时候,输入条件写成:{HTTP_X-Forwarded-Proto} ,模式设置为 ^Http$即可。经过验证切实可用。
如果不知道header的值,则在请求中打印出来即可。netcore下用下面语句在View视图中打印 header和其值
@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor HttpContextAccessor
@{
Layout = "_layout";
}
@{
void PrintHeader()
{
var context = HttpContextAccessor.HttpContext;
foreach (var header in context.Request.Headers)
{
<p>@($"{header.Key}: {header.Value}")</p>
}
}
PrintHeader();
}
这里不上图了,因为公司服务器有水印。
(1)iis作为代理服务器时默认没有 HTTP_X-Forwarded-Proto 头,此时如果需要启用 X-Forwarded-Proto 需要在iis的网站窗格下。点击Url重写→查看服务器变量,在右侧窗格点击添加,创建一个新的变量,变量名为:X-Forwarded-Proto。返回到Url重写窗格,点击 添加规则→空白规则,填写名称,匹配模式,在窗格的“服务器变量” 处点击添加按钮,下拉选择 HTTP_X-Forwarded-Proto ,值为 https,点击确定保存,然后应用即可。
如果你用netcore,上文中的代码无法打印处 X-Forwarded-Proto 这个header ,netcore自动解析 X-Forwarded-Proto 作为 Request.Scheme 的值,在header中也无法获取到
(2)iis配置301/302跳转
在Url重写窗格中,填写重写匹配模式和规则,在条件窗格中,点击添加,条件输入:{HTTP_X-Forwarded-Proto} 可以匹配 上游代理转发过来的 Scheme 方案。
使用{HTTP_HOST} 可以匹配原始请求的Host
本文链接:https://blog.nnwk.net/article/164
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论