我想使用以下HTTP模块将请求重写到另一个文件夹的文件中:
public class MyHttpModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += (sender, e) =>
{
var httpApplication = (HttpApplication)sender;
var httpContext = httpApplication.Context;
if (httpContext.Request.Url.ToString().Contains("styles/style.css"))
{
httpContext.RewritePath("~/some/other/folder/styles/style.css");
}
};
}
public void Dispose() { }
}
代码似乎按预期工作(即在RewritePath()
Request.Url
包含重写的URL之后)但是当我尝试打开styles / style.css时出现403.2禁止错误。
当我在浏览器中打开重写的URL(在Request.Url
调用之后从RewritePath()
获取)时,我正确地看到了CSS文件(即我打开类似styles / style.css的东西并得到了什么&# 39; s在some / other / folder / styles / style.css下。
失败的请求跟踪还显示我的模块执行了正确的重写。这个跟踪条目对应于错误:
82. -NOTIFY_MODULE_END
ModuleName ManagedPipelineHandler
Notification MAP_REQUEST_HANDLER
fIsPostNotificationEvent false
NotificationStatus NOTIFICATION_CONTINUE
83. -MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web Core
Notification MAP_REQUEST_HANDLER
HttpStatus 403
HttpReason Forbidden
HttpSubStatus 2
ErrorCode Access is denied. (0x80070005)
84. -SECURITY_DENIED_BY_ACCESS_FLAGS
CurrentFlags 512
NeededFlags 1
据我所知,它需要AccessRead(1)权限,但获得了AccessScript(512)(请参阅this topic)。这让我很困惑,因为我猜后者的权限级别比前者高。
更改相关文件的文件夹上的文件系统权限似乎没有效果(即使完全控制每个人都没有帮助)。应用程序池正在使用我的用户(管理员帐户)作为其身份(但将其保留在AppPoolIdentity上并不帮助)。
该文件的文件夹有一个Web.config,如果重要的话,它包含这个:
<handlers accessPolicy="Script,Read">
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule" preCondition="integratedMode" resourceType="File" requireAccess="Read" />
</handlers>
使用IIS URL Rewrite模块进行相同的重写。
更新
我注意到在原始的,不是现有的路径(即〜/ styles / style.css)下创建了一个物理文件夹,只包含一个带有上述处理程序声明的Web.config(加上system.webServer周围的共同仪式)等)使错误消失。当然,这不是我的解决方案,但至少它提供了一些暗示。
UPDATE2:
我使用空的ASP.NET应用程序进行了一些测试。仅在根Web.config中设置模块,而不是将Web.config添加到Styles文件夹。
将此添加到根Web.config(这是原始应用程序的Web.config中的内容)导致错误。哈!
<handlers accessPolicy="Script">
<clear />
</handlers>
将accessPolicy修改为&#34;脚本,读取&#34;。解决了这个问题......
有人可以解释一下吗?
答案 0 :(得分:0)
您可以尝试在&#34;某些&#34;中使用web.config。文件夹[〜/ some / other / folder / styles / style.css]并删除其子文件夹中的所有web.config文件。在唯一的web.config中你可以试试这个:
<handlers accessPolicy="Script,Read">
<!--
iis7 - for any request to a file exists on disk, return it via native http module.
accessPolicy 'Script' is to allow for a managed 404 page.
-->
<add name="StaticFileHandler" path="*" verb="*" modules="StaticFileModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>