更新1:
我现在已经设置了IIS6,因此.NET可以处理对.css文件的调用。我现在要做什么来让它根据referal url更改css文件?因此,如果referal网址为http://intranet/ ,则应继续调用旧样式表。如果referal网址为http://intranetv2/ ,则应调用新的样式表。
原始问题:
背景:
我有2个搜索引擎。 1是旧的,另一个是全新的(开发阶段)。搜索引擎1在domain1.com上,搜索引擎2在domain2.com上。两个域都在同一台服务器上。两者都根据用户输入搜索引擎的内容在domain1.com上搜索网页。两个搜索引擎之间的区别在于新的搜索引擎更快,产生更准确的结果,并且具有极大改进的用户界面。两个搜索引擎都将保持活跃状态,以便用户可以在他们自己的时间内习惯新的搜索引擎,而不是仅仅将它们扔进深层并完全删除旧的搜索引擎。
无论如何,基本上,足够的背景,因为可搜索的页面使用旧的搜索引擎驻留在旧域名上,而新搜索引擎位于新域名上,...
问题:
...我可以使用HttpModule,或.NET的其他部分,或者来自IIS6的东西甚至捕获新搜索引擎生成的页面链接,并动态更改附加到旧的可搜索页面上的css文件域?
原因:
实际上使它看起来像一个完整的全新网站,如果旧域上的搜索引擎用于访问旧域上的页面,则使用旧样式表,但如果新域上的搜索引擎用于访问旧域名上的可搜索文件,应使用新样式表使旧页面看起来新。由于有大量可搜索的页面,在10,000的区域内,编辑每个页面以添加if语句以在向页面添加样式表之前检查引用域名是不现实的选择。
环境:
旧的搜索引擎以及旧域上的可搜索页面使用.net 1.something,但新域名上的新搜索引擎使用的是.net 3.5,我使用的是vb.net for asp .net页面该服务器是IIS6服务器。
答案 0 :(得分:2)
Server.MapPath()
在HttpRequest.Url.AbsolutePath
上获取物理路径这是一个处理程序(简化),我经常使用它来为不同的域服务备用文件:
using System;
using System.IO;
using System.Web;
public class MultiDomainFileHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string filePath = GetDomainSpecificFilePath(context.Request.Url.Host,
context.Server.MapPath(context.Request.Url.AbsolutePath));
if (File.Exists(filePath))
{
switch (Path.GetExtension(filePath).ToLower())
{
case ".css": context.Response.ContentType = "text/css"; break;
case ".jpg":
case ".jpeg": context.Response.ContentType = "image/jpeg"; break;
//other types you want to handle
default: context.Request.ContentType = "application/octet-stream"; break;
}
context.Response.WriteFile(filePath); //Write the file to response
}
else context.Response.StatusCode = 404;
}
private string GetDomainSpecificFilePath(string domain, string originalPath)
{
string prefix = "";
switch (domain.ToLower())
{
case "intranetv2": prefix = FILE_PREFIX_INTRANETV2; break;
case "www.example.com": prefix = FILE_PREFIX_EXAMPLE_DOT_COM; break;
//other domains you want to handle
}
string dir = Path.GetDirectoryName(originalPath);
string fileName = prefix + Path.GetFileName(originalPath);
return Path.Combine(dir, fileName);
}
const string FILE_PREFIX_INTRANETV2 = "v2.", FILE_PREFIX_EXAMPLE_DOT_COM = "ex.com.";
public bool IsReusable { get { return false; } }
}
现在,您只需要在同一目录中拥有备用文件。 E.g:
/Images/logo.jpg
/Images/v2.logo.jpg
/Styles/mystyle.css
/Styles/v2.mystyle.css
我希望这会有所帮助:)
答案 1 :(得分:1)
是的,您应该可以在“旧”应用程序上使用HttpModule来拦截对旧CSS的调用。 根据服务器上的IIS版本,您可能需要进行一些配置以确保.NET正在处理对.css文件的调用,否则将不会调用您的HttpModule。 请参阅this question以供参考。
.NET处理CSS调用后,您可以动态切换css,以防请求是针对“旧”css文件。
这是一篇旧文章(因为您使用的是.NET 1.1),它应该为您指明实施和配置IIS的正确方向:"URL Rewriting in ASP.NET"。基本上你正在做的事情是非常相似的,因为你正在“重写”一个特定的URL(旧的CSS文件中的一个)来指向不同的内容。
答案 2 :(得分:1)
我为内容管理系统提供的文件做了一些类似的事情。如果启用了http处理程序,它会检查文件名和路径以查看用户是否有权访问该资源。如果用户这样做,它会流式传输文件,否则返回401未授权的文件。
我不明白为什么你不能使用处理程序跳转到css文件的管道,检查主机名,然后流出另一个css文件(如果适用)。这在IIS7中很简单,带有集成管道(您没有指定),但如果您让.net处理css扩展名,也可以在IIS6中使用。
如果您对此方法感兴趣,请告诉我,我会跟踪一些代码。
编辑 - 这是一些代码
这不是您正在寻找的,但您可能会得到一些想法。
注意:这是在带有集成管道的IIS7中,因此在IIS6中,您必须进行更改,以便.css文件由.net进程处理。
Public Class FileManagerFileAuthorization
Implements IHttpHandler
Public ReadOnly Property IsReusable As Boolean Implements System.Web.IHttpHandler.IsReusable
Get
Return True
End Get
End Property
Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
Dim req As HttpRequest = context.Request
Dim absolutePath As String = req.Path
Dim fileName As String = Path.GetFileName(absolutePath)
Dim physicalPathAndFileName As String = HttpContext.Current.Server.MapPath(absolutePath)
If File.Exists(physicalPathAndFileName) Then
' roles that the user is part of. If the user is not authenticated they are part of the public role only
Dim memberRoles As String()
If req.IsAuthenticated = False Then
memberRoles = New String() {ConfigurationManager.AppSettings("PublicRole")}
Else
Dim r As New Roles()
memberRoles = r.GetRolesForUser("")
End If
' check permissions: transmit file or deliver 401
Dim folderVirtualPath As String = Path.GetDirectoryName(absolutePath).Replace("\"c, "/"c)
Dim permissions As FileManager.FolderPermissions = FileManager.GetFolderPermissions(folderVirtualPath, memberRoles)
If permissions And FileManager.FolderPermissions.View Then
context.Response.ContentType = FileManager.GetContentType(fileName)
context.Response.AddHeader("Content-Length", New FileInfo(physicalPathAndFileName).Length.ToString())
context.Response.TransmitFile(physicalPathAndFileName)
Else
' unauthorized
context.Response.StatusCode = 401
End If
Else
' file not found
context.Response.StatusCode = 404
End If
context.Response.End()
End Sub
End Class
web.config - 再次 - 这是IIS7,因此您将使用system.web部分下的<httpHandlers/>
部分。我正在寻找Userfiles目录中的任何文件,但我认为您可以指向具有此文件的文件。
<system.webServer>
<handlers>
<add name="FileManagerFileAuthorization" path="Userfiles*" verb="GET" type="FileManagerFileAuthorization" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
注意:强>
要允许.net处理IIS中的非.NET文件,您必须允许.net进程处理这些文件。为此,请打开IIS管理器,导航到该网站,然后单击属性。转到“主目录”选项卡,然后单击“配置”。添加通配符映射,然后选择.net dll。如果您不确定,请从下面的.ascx复制链接。
由于它是IIS6,您将无法使用上面的system.webServer部分,您需要以旧方式添加http处理程序。此链接说明了这一点:http://msdn.microsoft.com/en-us/library/46c5ddfy.aspx
答案 3 :(得分:1)
根据域名,您可以从后面的代码(.vb或.cs文件甚至类)动态控制页面的一部分。这将使您可以控制根据domian名称替换css文件。捕获代码中的域名,然后替换css文件/链接,事实上后面的代码中的整个部分。 你可以用C#或VB做到这一点。
答案 4 :(得分:1)
我不建议使用httpModule
,因为它会针对可能会降低性能的每个请求进行调用。然而,您可以使用httpHandlers
来仅处理特定路径。因此,我的投票是使用httpHandlers
。
但是有一个小故障。默认情况下,IIS 6默认情况下不会将非ASP.Net扩展请求(除.aspx,.ashx,.axd以外的所有扩展名)传递给ASP.Net。
因此,您需要为CSS扩展添加ISAPI模块以将请求传递给aspnet_isapi.dll(您可以从.aspx扩展处理程序中找到完整路径)。
此link可能有助于设置ISAPI模块。
ASP.Net开始处理.CSS
扩展程序后,请使用您的逻辑编写httpHandler
并在httphandlers
文件的web.config
部分下添加以下行
假设你的httpHandler是CSSHttpHandler
,那么代码将是这样的。
<add verb="HEAD,GET" path="*.css" type="CSSHttpHandler">
希望这有帮助。
答案 5 :(得分:0)
也许您可以在旧域上添加HTTP模块,并检查request.UrlReferrer是否是来自新域的搜索结果页,然后在生成的输出中替换旧样式表的链接。
答案 6 :(得分:0)
正如我在评论中所说:one of the answers,我认为http_referer标题将指向链接/导入所请求的css文件的内容页面,而不是链接到内容页面的搜索结果页面。因此,即使搜索结果在http://intranetv2上,在css文件请求期间Request.ServerVariables [“HTTP_REFERER”]也将为http://intranet,您将继续获取旧的css文件。
好像你必须找到一种方法来从新的http://intranetv2域提供10000个内容页面,或者想出一种在内容aspx页面请求期间设置标志的方法(也许在global.asax Application_BeginRequest中,可以在css文件请求期间读取和操作(由HttpHandler,就像其他人建议的那样)。
不确定适当的信号机制是什么。它需要按用户而不是每个应用程序工作,并且在多个不同的文件请求期间可用并且持久存在,并且选择受到使用.NET 1.1的限制。