我正在尝试将我的资产投放到同一个域的一个子域中。因此,当我的主域为https://localhost:44111/
时,资产网址将类似于https://assets.localhost:44111/css/style.css
style.css
文件发出请求,要求包含自定义字体my_custom_font.eot
,像这样
@font-face {
....
src: url('/css/fonts/my_custom_font.eot?123');
}
当我包含资产子域中的style.css
文件时,出现以下错误
跨域请求被阻止:同一起源策略不允许读取https://assets.localhost:44111/css/fonts/my_custom_font.eot?123处的远程资源。 (原因:CORS标头“ Access-Control-Allow-Origin”缺失)。
[为了确保我清楚,style.css
和my_custom_font.eot
都位于同一域assets.localhost:44111
上。包含style.css
的请求没有问题。但是,当style.css
要求包含my_custom_font.eot
时,该请求被禁止。
我尝试按照documentation启用CORS。我在Startup.ConfigureServices(IServiceCollection services)
方法中添加了以下代码
services.AddCors(options =>
{
options.AddPolicy("AllowSubDomainTraffic",
builder =>
{
builder.WithOrigins("https://assets.localhost:44111")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
然后在Startup.Configure(IApplicationBuilder app, IHostingEnvironment env)
方法中,我添加了以下内容
app.UseCors("AllowSubDomainTraffic");
但是,我仍然在浏览器的控制台中收到CORS header ‘Access-Control-Allow-Origin’ missing
错误。
这是我对应用程序中的子域的响应方式
app.MapWhen(context => {
return context.Request.Host.Value.StartsWith("assets.", StringComparison.OrdinalIgnoreCase)
} (appBuilder) =>
{
appBuilder.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider("C:/assets"),
});
});
如何为子域正确启用CORS?
更新
当我手动更改对资产的请求时,它会起作用!在此处手动更改请求会感到错误。有什么想法吗?
app.MapWhen(context => {
return context.Request.Host.Value.StartsWith("assets.", StringComparison.OrdinalIgnoreCase)
} (appBuilder) =>
{
appBuilder.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider("C:/assets"),
// This is what I mean by manually altering the request
OnPrepareResponse = ctx =>
{
ctx.Context.Request.Headers["Access-Control-Allow-Origin"] = "*";
}
});
});
WithOrigins(string[])接受字符串的参数(字符串数组,string [])。这使您可以:
builder.WithOrigins("https://localhost:44111", "https://assets.localhost:44111")
.AllowAnyHeader()
.AllowAnyMethod();
[note:请不要忘记cors网址不能以/
]结尾>