IIS 日志中的自定义字段对于某些路径的值具有“-”
Custom field in IIS log has "-" for value for certain Paths
我在 IIS 上托管的 ASP.NET 应用程序的 "web.config" 中配置了以下重写规则:
<rewrite>
<rules>
<rule name="setappname">
<match url=".*" />
<serverVariables>
<set name="CONTAINER_APP_NAME" value="desiredValue" />
</serverVariables>
</rule>
</rules>
</rewrite>
在 "applicationHost.config" 中,我有以下片段:
<sites>
<site name="mysite" id="1" serverAutoStart="true">
<application path="/" applicationPool=".NET v4.5">
<virtualDirectory path="/" physicalPath="c:\mysite" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
<logFile directory="c:\iislog" period="MaxSize" truncateSize="4294967295">
<customFields>
<add logFieldName="x-forwarded-for" sourceName="X-Forwarded-For" sourceType="RequestHeader" />
<add logFieldName="container-app" sourceName="CONTAINER_APP_NAME" sourceType="ServerVariable" />
</customFields>
</logFile>
<applicationDefaults preloadEnabled="true" />
</site>
</sites>
和
<system.webServer>
<rewrite>
<allowedServerVariables>
<add name="CONTAINER_APP_NAME" />
</allowedServerVariables>
</rewrite>
</system.webServer>
这很好用(我在日志中看到了 2 个自定义字段),除非路径以“/”结尾(例如:/
或 /APath/
)。在这些情况下,container-app
字段(使用服务器变量)的值始终为“-”。例如:
$ curl --silent --output /dev/null -H "X-Forwarded-For:10.3.2.12" http://localhost/APath/
产量:
2019-12-02 20:47:32 172.29.152.165 GET /APath/ - 80 - 192.168.7.4 curl/7.67.0 - 200 0 0 121 10.3.2.12,+::1 -
鉴于:
$ curl --silent --output /dev/null -H "X-Forwarded-For:10.3.2.12" http://localhost/home.aspx
产量:
2019-12-02 20:50:17 172.29.152.165 GET /home.aspx - 80 - 192.168.7.4 curl/7.67.0 - 200 0 0 63 10.3.2.12,+::1 desiredValue
我什至启用了失败请求跟踪以查看重写规则是否可能没有选择这些路径,但我可以确认规则与路径匹配并且服务器变量设置为所需的值。
我想知道是否还有其他任何我可以尝试解决此问题的方法。为什么没有正确记录此类路径?
我想我发现了问题并将其张贴在这里供其他人使用。
通过查看失败的请求跟踪,我可以看到 IIS 为目录的默认文档(以“/”结尾的 URI)创建了子请求。显然,根据设计,重写规则不适用于子请求(例如:https://forums.iis.net/t/1152699.aspx)。
为了解决这个问题,我创建了一个重写规则来将此类请求更改为对文档的显式请求,以便在主进程级别应用另一个重写规则:
<rewrite>
<rules>
<rule name="setExplictDoc">
<match url="(.*(APath)/$)" />
<action type="Rewrite" url="{R:0}Default.aspx" />
</rule>
<rule name="setappname">
<match url=".*" />
<serverVariables>
<set name="CONTAINER_APP_NAME" value="desiredValue" />
</serverVariables>
</rule>
</rules>
</rewrite>
我在 IIS 上托管的 ASP.NET 应用程序的 "web.config" 中配置了以下重写规则:
<rewrite>
<rules>
<rule name="setappname">
<match url=".*" />
<serverVariables>
<set name="CONTAINER_APP_NAME" value="desiredValue" />
</serverVariables>
</rule>
</rules>
</rewrite>
在 "applicationHost.config" 中,我有以下片段:
<sites>
<site name="mysite" id="1" serverAutoStart="true">
<application path="/" applicationPool=".NET v4.5">
<virtualDirectory path="/" physicalPath="c:\mysite" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
<logFile directory="c:\iislog" period="MaxSize" truncateSize="4294967295">
<customFields>
<add logFieldName="x-forwarded-for" sourceName="X-Forwarded-For" sourceType="RequestHeader" />
<add logFieldName="container-app" sourceName="CONTAINER_APP_NAME" sourceType="ServerVariable" />
</customFields>
</logFile>
<applicationDefaults preloadEnabled="true" />
</site>
</sites>
和
<system.webServer>
<rewrite>
<allowedServerVariables>
<add name="CONTAINER_APP_NAME" />
</allowedServerVariables>
</rewrite>
</system.webServer>
这很好用(我在日志中看到了 2 个自定义字段),除非路径以“/”结尾(例如:/
或 /APath/
)。在这些情况下,container-app
字段(使用服务器变量)的值始终为“-”。例如:
$ curl --silent --output /dev/null -H "X-Forwarded-For:10.3.2.12" http://localhost/APath/
产量:
2019-12-02 20:47:32 172.29.152.165 GET /APath/ - 80 - 192.168.7.4 curl/7.67.0 - 200 0 0 121 10.3.2.12,+::1 -
鉴于:
$ curl --silent --output /dev/null -H "X-Forwarded-For:10.3.2.12" http://localhost/home.aspx
产量:
2019-12-02 20:50:17 172.29.152.165 GET /home.aspx - 80 - 192.168.7.4 curl/7.67.0 - 200 0 0 63 10.3.2.12,+::1 desiredValue
我什至启用了失败请求跟踪以查看重写规则是否可能没有选择这些路径,但我可以确认规则与路径匹配并且服务器变量设置为所需的值。
我想知道是否还有其他任何我可以尝试解决此问题的方法。为什么没有正确记录此类路径?
我想我发现了问题并将其张贴在这里供其他人使用。
通过查看失败的请求跟踪,我可以看到 IIS 为目录的默认文档(以“/”结尾的 URI)创建了子请求。显然,根据设计,重写规则不适用于子请求(例如:https://forums.iis.net/t/1152699.aspx)。
为了解决这个问题,我创建了一个重写规则来将此类请求更改为对文档的显式请求,以便在主进程级别应用另一个重写规则:
<rewrite>
<rules>
<rule name="setExplictDoc">
<match url="(.*(APath)/$)" />
<action type="Rewrite" url="{R:0}Default.aspx" />
</rule>
<rule name="setappname">
<match url=".*" />
<serverVariables>
<set name="CONTAINER_APP_NAME" value="desiredValue" />
</serverVariables>
</rule>
</rules>
</rewrite>