Перенаправить весь веб-трафик, кроме нескольких директорий / путей? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть веб-сайт, на котором мне нужно перенаправить почти все на другой домен, за исключением нескольких каталогов / путей. Сервер работает 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). Перезапись URL-адреса в IIS невозможна, поскольку это ограничение в хостинг-провайдере.

редактировать:

Я только что понял, что вышеописанная функциональность явно не заявляет этот случай:

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

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Я создал это некоторое время назад, чтобы перенаправить существующее приложение со старого пути на новый. Я полагаю, что это зависит от наличия подпапок, например «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"}            
    ]
} />

index.cfm

[blank file]

Application.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>
0 голосов
/ 02 декабря 2011

Вы лучше обрабатываете перенаправления с сервера, если можете, но если вы можете, вы можете сделать это с помощью 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>
...