0

我有一个网站,我需要将几乎所有内容重定向到另一个域,除了几个目录/路径。服务器在托管环境中运行 ColdFusion 和 IIS。

功能:

a) http://example1.com redirects to http://example2.com
b) http://example1.com/special stays put
c) http://example1.com/anydir redirects to http://example2.com

关于我如何做到这一点的任何建议?

我考虑在 ColdFusion 中这样做,但这不能处理案例 c)。无法在 IIS 中重写 URL,因为这是托管服务提供商的限制。

编辑:

我刚刚意识到上面的功能没有明确说明这种情况:

d) http://example1.com/anydir/anydir redirects to http://example2.com
4

2 回答 2

1

我前一阵子创建了它,以将现有应用程序从旧路径重定向到新路径。我相信它依赖于子文件夹的存在,例如“anydir/anydir/”实际上必须是真正的文件夹。我基本上只是将它粘贴到现有的应用程序文件夹中,因此配置、应用程序和索引文件被覆盖,然后根据配置中的定义进行重定向。

重定向定义是正则表达式,因此如果需要,实际上会变得相当复杂。它是一个有序数组,因此您可以先放置更具体的重定向,最后放置更通用的重定向。您可以在最后包含“最后的手段”重定向,或者如果没有定义匹配,则允许发生错误——这取决于您想要的精确度。

配置/config.cfm

<cfset config = {
    debug=true
    , redirects = [
        {find="^/path/temp/dir2/(.+)$", replace="http://temp.domain.com/dir2\1"}
        , {find="^/path/temp/(.+)$", replace="http://temp.domain.com/\1"}            
    ]
} />

索引.cfm

[blank file]

应用程序.cfc

<cfcomponent>
    <cfset this.name="Redirect#hash(getCurrentTemplatePath())#"/>

    <cfinclude template="config/config.cfm" />

    <cffunction name="onRequestStart">
        <cfset redirect(cgi.path_info) />
    </cffunction>

    <cffunction name="onMissingTemplate">
        <cfargument name="targetPage" required="true" />
        <cfset redirect(arguments.targetPage) />
    </cffunction>

    <cffunction name="redirect">
        <cfargument name="targetPage" required="true" />

        <cfset var i = 0 />
        <cfset var newpath = "" />

        <cfloop from="1" to="#arraylen(variables.config.redirects)#" index="i">
            <cfif refindnocase(variables.config.redirects[i].find, arguments.targetPage)>
                <cfset newpath = rereplacenocase(arguments.targetPage, variables.config.redirects[i].find, variables.config.redirects[i].replace) />
                <cfif len(cgi.query_string)>
                    <cfset newpath &= "?" & cgi.query_string />
                </cfif>

                <cfif variables.config.debug>
                    <cfoutput>#newpath#</cfoutput>
                    <cfabort>
                </cfif>

                <cflocation url="#newpath#" addtoken="false" />
            </cfif>
        </cfloop>

        <cfthrow type="custom.redirect.notfound" />
        <cfabort>
    </cffunction>

</cfcomponent>
于 2011-12-02T14:17:12.973 回答
0

如果可以的话,你最好用服务器处理重定向,但是如果可以的话,你可以用 CF 来做这样的事情。你的结构实际上取决于你需要处理的实际 URL 是什么。

您可能会使用正则表达式处理大小写 (c)。

<!---get the current URL--->
<cfset currentURL = "#cgi.server_name##cgi.path_info#" > 

<!---based on the URL, redirect accordingly--->
<cfif FindNoCase("example1.com/special", currentURL)>
    <!---do nothing--->
<cfelseif FindNoCase("example1.com", currentURL)>
    <cflocation url="http://www.example2.com" >
</cfif>
于 2011-12-01T22:58:40.993 回答