iis 中url重写或重定向中的匹配条件和服务器变量

9/7/2023 10:42:09 AM
1229
0

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_KEYSIZESSL/TLS 连接密钥大小的位数。
CERT_SECRETKEYSIZESSL/TLS 服务器私钥中的位数。
CERT_SERIALNUMBER客户端证书的序列号。
CERT_SERVER_ISSUER服务器证书的颁发者字段。
CERT_SERVER_SUBJECT服务器证书的接受方字段。
CERT_SUBJECT客户证书的接受方字段。
CONTENT_LENGTH请求正文的长度。
CONTENT_TYPE请求正文的 MIME 类型。 用于具有附加信息的查询,例如 GETPOSTPUT
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_ROOTIIS 网站的目录的物理路径。
FORWARDED_URL转发的 URL。
GATEWAY_INTERFACE服务器使用的 CGI 规范的修订版。 格式为 CGI/revision。
HTTPS如果请求通过安全通道 ((例如 SSL) )传入,则返回 ON ;或者,如果请求针对不安全的通道,则返回 OFF
HTTPS_KEYSIZESSL/TLS 连接密钥大小的位数。
HTTPS_SECRETKEYSIZE服务器证书私钥中的位数。
HTTPS_SERVER_ISSUER服务器证书的颁发者字段。
HTTPS_SERVER_SUBJECT服务器证书的使用者字段。
HTTP_METHOD用于发出请求的方法。
HTTP_URL原始编码 URL。
例如: /vdir/default.aspx?querystring
HTTP_VERSION请求协议的名称和版本 (原始形式的SERVER_PROTOCOL) 。
INSTANCE_IDIIS 站点 ID。
INSTANCE_META_PATH响应请求的 IIS 实例的元数据库路径。
INSTANCE_NAMEIIS 站点名称。
LOCAL_ADDR请求传入的服务器地址。 这一点对于可能有多个 IP 地址绑定到计算机的计算机上非常重要,并且你想要找出请求使用的地址。
LOGON_USER用户在连接到 Web 服务器时模拟的 Windows 帐户。 使用 REMOTE_USERUNMAPPED_REMOTE_USERAUTH_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_STRINGHTTP 请求中问号 (?) 后,字符串中存储的查询信息。
REMOTE_ADDR发出请求的远程主机的 IP 地址。
REMOTE_HOST发出请求的主机的名称。 如果服务器没有此信息,它将设置REMOTE_ADDR并将此保留为空。
REMOTE_PORTTCP 连接的客户端端口号。
REMOTE_USER在将用户名映射到 Windows 帐户之前,从客户端发送的授权标头派生的用户的名称。 如果在 Web 服务器上安装了将传入用户映射到帐户的身份验证筛选器,请使用 LOGON_USER 查看映射的用户名。
REQUEST_FILENAME当前请求的物理路径。
REQUEST_FLAGSHTTP_REQUEST标志。
例如, HTTP_REQUEST_FLAG_HTTP2 将为 HTTP/2 请求设置 标志。
REQUEST_METHOD用于发出请求的方法。
REQUEST_URIURI 的绝对路径部分。
例如 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 查看映射的用户名。
URLURL 的基部分,没有任何查询字符串信息。

官方给出的匹配条件有(不全)

  1. {HTTP_HOST}:表示请求的主机名。
  2. {HTTPS}:表示请求是否通过HTTPS协议进行。
  3. {HTTP_METHOD}:表示请求的HTTP方法。
  4. {URL}:表示请求的URL路径部分。
  5. {QUERY_STRING}:表示请求的URL查询字符串部分。
  6. {HTTP_USER_AGENT}:表示请求的User-Agent头部信息。
  7. {HTTP_REFERER}:表示请求的Referer头部信息。
  8. {HTTP_COOKIE}:表示请求的Cookie头部信息。
  9. {HTTP_FORWARDED}:表示请求的Forwarded头部信息。
  10. {REMOTE_ADDR}:表示请求的客户端IP地址。
  11. {SERVER_PORT}:表示请求的服务器端口号。
  12. {SERVER_NAME}:表示请求的服务器名。

匹配条件设置有个技巧,除了官方给的这些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

 

 

全部评论



提问