coldfusion url变量问题

时间:2011-09-12 03:41:40

标签: coldfusion

有时我们传递的url字符串如下:

http://www.oursite.com/index.cfm?layout=displayNews&newsArticle=1837

注意网址中的"&"。这会导致接收页面出现问题,该页面将url变量视为url.AMP;newsArticle我们无法始终控制它是以这种方式到达还是“&”。

在接收页面中,我们想要处理这两种格式可能到达的可能性。我做了一些不起作用的弱尝试,例如。

<cfif structkeyexists(url,'AMP;NEWSARTICLE')>
     <cfset url.newsArticle = evaluate('#url.AMP;NEWSARTICLE#')> <!--- this line errors on the semicolon after AMP --->
</cfif>

任何指针都非常感激。

3 个答案:

答案 0 :(得分:4)

替换cgi.query_string中的字符串无法解决问题,因为此时填充了URL范围。

您可以将该值引用为结构:

<cfset url.newsarticle = url['amp;newsarticle']>

所以将它与structKeyExists结合使用:

<cfif structkeyexists(url,'AMP;NEWSARTICLE')>
    <cfset url.newsarticle = url['amp;newsarticle]>
</cfif>

进一步扩展,您可以过滤掉整个网址范围:

<cfloop collection="#url#" item="key">
    <cfif left(key,4) eq "amp;">
        <cfset url[replace(key,"amp;","")] = url[key]>
    </cfif>
</cfloop>

答案 1 :(得分:0)

您可以尝试

 replaceNoCase(cgi.query_string, '&amp;', '&', 'all')

然后只是正常处理..那样只有html实体被替换......

-Sean

答案 2 :(得分:0)

可能有一种更清洁的方式......但这似乎对我有用(语法假设为CF9):

<cfscript>
    cleanURL = {};

    for ( var item in URL ) {
        if ( left( item, 4 ) == "amp;" ) {
            key = replaceNoCase( item, 'amp;', '' ); // right() also works here
        } else {
            key = item;
        }

        cleanURL[ key ] = URL[ item ];
    }
</cfscript>

<cfdump var="#cleanURL#" />