ASP.NET Core 3.1 图像 URL 错误代码 302 重定向
Posted
技术标签:
【中文标题】ASP.NET Core 3.1 图像 URL 错误代码 302 重定向【英文标题】:ASP.NET Core 3.1 Image Url Error Code 302 Redirection 【发布时间】:2021-11-15 11:21:53 【问题描述】:ASP.NET Core 3.1 网站托管在使用 https 的 IIS 的 Windows 服务器上。
尝试访问特定文件夹中的图片时,图片无法显示,请求重定向到登录页面。
重定向失败的图像路径示例:
https://example.com/samadhi/staff/6890.jpg
https://example.com/samadhi/staff/logo2.jpg
有效的图像路径示例:
https://example.com/samadhi/mms/qrcode15.jpg
https://example.com/samadhi/body_map.jpg
我还有其他文件夹中的图片可以正常工作 - 只有一个文件夹中的图片会出现这种情况。 我检查了文件夹和文件的权限,但它们都是相同的,具有完全访问权限。 我尝试删除文件夹和文件并重新上传它们,但没有任何变化。 最初托管网站时,这些图片运行良好。 这个问题是在几周前才开始的。 我在文件夹中添加了一个文本文件进行测试,但它也会重定向。在 Plesk 控制面板中,我看到“IIS 访问”条目,如下所示:
302 GET /samadhi/staff/UserPic.jpg - HTTP/2
302 GET /samadhi/staff/318.jpg - HTTP/1.1
其他更详细的“ModSecurity”条目显示如下:
3891110101670432115 124.171.83.143 80 127.0.0.1 80
--6c3d0000-B--
GET /samadhi/staff/6890.jpg HTTP/1.1
Host: example.net.au
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0; Zoom 3.6.0)
--6c3d0000-F--
HTTP/1.1 500 Internal Server Error
--6c3d0000-H--
Message: Warning. Match of "pm AppleWebKit android" against "REQUEST_HEADERS:User-Agent" required. [file "C:\/Program Files (x86)/Plesk/ModSecurity/rules/modsecurity_crs-plesk/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "1228"] [id "920300"] [msg "Request Missing an Accept Header"] [severity "NOTICE"] [ver "OWASP_CRS/3.3.0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"] [tag "paranoia-level/2"]
Apache-Handler: IIS
Stopwatch: 1632221945009248 4997 (- - -)
Stopwatch2: 1632221945009248 4997; combined=4997, p1=4997, p2=0, p3=0, p4=0, p5=0, sr=4997, sw=0, l=0, gc=0
Producer: ModSecurity for IIS (STABLE)/2.9.3 (http://www.modsecurity.org/); OWASP_CRS/3.3.0.
Server: ModSecurity Standalone
Engine-Mode: "ENABLED"
--6c3d0000-Z--
--84670000-A--
Startup.cs
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
public void ConfigureServices(IServiceCollection services)
try
services.AddRazorPages()
.AddRazorRuntimeCompilation();
services.AddControllersWithViews();
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
o.ExpireTimeSpan = new TimeSpan(90, 0, 0, 0);
o.AccessDeniedPath = new PathString("/Samadhi/SignIn/");
o.LoginPath = new PathString("/Samadhi/SignIn/");
o.LogoutPath = new PathString("/Samadhi/SignOut/");
var defaultCallback = o.Events.OnRedirectToLogin;
o.Events.OnRedirectToLogin = context =>
if (context.Request.Path.StartsWithSegments(new PathString("/samadhi"), StringComparison.OrdinalIgnoreCase))
context.RedirectUri = "/Samadhi/SignIn/";
context.Response.Redirect(context.RedirectUri);
else if (context.Request.Path.StartsWithSegments(new PathString("/consultant"), StringComparison.OrdinalIgnoreCase))
context.RedirectUri = "/Consultant/SignIn/";
context.Response.Redirect(context.RedirectUri);
else if (context.Request.Path.StartsWithSegments(new PathString("/candidate"), StringComparison.OrdinalIgnoreCase))
context.RedirectUri = "/Candidate/SignIn/";
context.Response.Redirect(context.RedirectUri);
return defaultCallback(context);
;
o.Validate();
);
services.AddScoped<CustomCookieAuthenticationEvents>();
services.Configure<Microsoft.AspNetCore.Identity.IdentityOptions>(o =>
// Password settings
o.Password.RequireDigit = true;
o.Password.RequireLowercase = true;
o.Password.RequireNonAlphanumeric = true;
o.Password.RequireUppercase = true;
o.Password.RequiredLength = 8;
o.Password.RequiredUniqueChars = 1;
// Lockout settings
o.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
o.Lockout.MaxFailedAccessAttempts = 5;
o.Lockout.AllowedForNewUsers = true;
// User settings
o.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
o.User.RequireUniqueEmail = true;
);
// add detection services container and device resolver service
services.AddDetectionCore()
.AddDevice();
// google recaptcha
services.Configure<ReCAPTCHASettings>(Configuration.GetSection("GooglereCAPTCHA"))
.AddTransient<ReCAPTCHAService>();
// services.AddRouting(options => options.LowercaseUrls = true);
services.AddMvc();
services.AddAntiforgery();
services.Configure<MvcOptions>(options =>
options.Filters.Add(new RequireHttpsAttribute());
);
catch (Exception ex)
gFunc.ProcessError(ex);
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
try
// set file path
gFunc.SetLogFilePaths(Directory.GetCurrentDirectory());
// environment
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapControllerRoute(
name: "default",
pattern: "controller=Home/action=Index/id?");
);
var provider = new FileExtensionContentTypeProvider();
provider.Mappings.Add(".exe", "application/octect-stream");
app.UseStaticFiles(new StaticFileOptions
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "canvas")),
RequestPath = "/canvas",
ServeUnknownFileTypes = true,
DefaultContentType = "plain/text",
ContentTypeProvider = provider
);
provider = new FileExtensionContentTypeProvider();
provider.Mappings.Add(".exe", "application/octect-stream");
app.UseStaticFiles(new StaticFileOptions
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "samadhi")),
RequestPath = "/samadhi",
ServeUnknownFileTypes = true,
DefaultContentType = "plain/text",
ContentTypeProvider = provider
);
catch (Exception ex)
gFunc.ProcessError(ex);
Web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="dotnet" arguments=".\Samadhi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"/>
</system.webServer>
</location>
<system.web>
<compilation tempDirectory="C:\Inetpub\vhosts\example.com\tmp"/>
</system.web>
<system.webServer>
<tracing>
<traceFailedRequests>
<clear/>
</traceFailedRequests>
</tracing>
</system.webServer>
</configuration>
<!--ProjectGuid: b79c90dc-200d-42a3-a1c4-d3d389a66244-->
【问题讨论】:
你能分享你的startup.cs吗?值得研究您的身份验证是如何在那里确定的。有问题的路径就像 domain.com/images? @BenMatthews 好的,我添加了额外的信息,包括 Startup.cs 可悲的是,没有什么事情会立即成为这个问题的罪魁祸首。它可能在代码中,但可能在 plesk 或其他东西中。这些图像是否在 html 中的 img 标记中引用,用于那些有效的和不有效的。 您是否在 IIS 上设置了任何 url 重写规则?你能显示 web.config 吗? @BruceZhang 我只能通过 Plesk 作为其共享主机访问 IIS,但我从未设置任何 url 重写规则。我已经更新了我的帖子以包含 web.config 【参考方案1】:我傻了!
我网站的一个控制器(一个名为“Samadhi”的控制器)有一个简单地称为“Staff”的路由。我完全忘记了这条路线,当然它与图像路径冲突(静态文件路径:/samadhi/staff/001.jpg)
我将路线重命名为“ManageStaff”,现在图像 url 工作正常。
违规路线:
[HttpGet]
[Authorize(Roles = gFunc.CLAIM_ROLE_SAMADHI_SHOP)]
public async Task<ViewResult> Staff()
【讨论】:
以上是关于ASP.NET Core 3.1 图像 URL 错误代码 302 重定向的主要内容,如果未能解决你的问题,请参考以下文章
当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由
ASP.NET Core--.net core 3.1 部署到 IIS
asp.net core tilde slash (~/) 不解析图像路径
从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后,User.Claims 为空
Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作