如何去除url变量

时间:2011-01-15 17:02:24

标签: coldfusion

我有一个url.LoginID,当用户点击登录链接时,我想将其从地址栏中删除。它必须是书签,它不能是表单提交。

问:如何从Index.cfm中删除?LoginID?LoginID = XYZ& AssignmentID = 123

这可能与以下几点有关:

<cflocation url="#cgi.SCRIPT_NAME#?#cgi.QUERY_STRING#" addtoken="no">

5 个答案:

答案 0 :(得分:19)

看起来你走在正确的轨道上。

如果loginID是查询字符串中唯一的东西,您只需在没有查询字符串的情况下cflocation到目标页面。

如果查询字符串中还有其他数据,那么您可以执行以下操作:

<cfset q = reReplaceNoCase(cgi.query_string, "LOGINID=[^&]+&?", "")>
<cflocation url="#cgi.SCRIPT_NAME#?#q#">

这基本上删除了loginid和所有内容,直到字符串的en或下一个URL变量。

答案 1 :(得分:4)

像往常一样,已经有人在CFLIB上提供了一个UDF:queryStringDeleteVar

你可以这样做

<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID",cgi.QUERY_STRING)#" 
    addtoken="no"
>

CGI.QUERY_STRING实际上是第二个arg的默认值,所以这也可以正常工作

<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID")#" 
    addtoken="no"
>

以下是queryStringDeleteVar的代码:

<cfscript>
/**
 * Deletes a var from a query string.
 * Idea for multiple args from Michael Stephenson (michael.stephenson@adtran.com)
 * 
 * @param variable      A variable, or a list of variables, to delete from the query string. 
 * @param qs      Query string to modify. Defaults to CGI.QUERY_STRING. 
 * @return Returns a string. 
 * @author Nathan Dintenfass (michael.stephenson@adtran.comnathan@changemedia.com) 
 * @version 1.1, February 24, 2002 
 */
function queryStringDeleteVar(variable){
    //var to hold the final string
    var string = "";
    //vars for use in the loop, so we don't have to evaluate lists and arrays more than once
    var ii = 1;
    var thisVar = "";
    var thisIndex = "";
    var array = "";
    //if there is a second argument, use that as the query string, otherwise default to cgi.query_string
    var qs = cgi.query_string;
    if(arrayLen(arguments) GT 1)
        qs = arguments[2];
    //put the query string into an array for easier looping
    array = listToArray(qs,"&");        
    //now, loop over the array and rebuild the string
    for(ii = 1; ii lte arrayLen(array); ii = ii + 1){
        thisIndex = array[ii];
        thisVar = listFirst(thisIndex,"=");
        //if this is the var, edit it to the value, otherwise, just append
        if(not listFind(variable,thisVar))
            string = listAppend(string,thisIndex,"&");
    }
    //return the string
    return string;
}
</cfscript>

答案 2 :(得分:3)

有很多方法可以做到这一点,这里有一种方法是使用列表循环来读取现有参数并检查你想要忽略的那个:

<cfset newParams = "" />

<cfloop list="#cgi.query_string#" delimiters="&" index="i">
    <cfif listFirst(i, "=") neq "loginID">
        <cfset newParams = listAppend(newParams, i, "&") />
    </cfif>
</cfloop>


<cflocation url="#cgi.script_name#?#newParams#" addtoken="no">

希望有所帮助!

答案 3 :(得分:2)

假设您真的不想删除?以保持URL有效,那么简单的正则表达式应该有效:

QUERY_STRING = ReReplaceNoCase(cgi.QUERY_STRING, "LoginID=.+\&", "");
顺便说一句,我不知道你为什么要在网址中保留LoginID,这可能是不安全的做法。使用会话听起来更好。

编辑:Ben的正则表达式更好,因为我的版本非常简单,可以在最后一个之前“吃掉”所有key=value对。

答案 4 :(得分:1)

插入famous Zawinski two problem regex quote并以不同方式解决:

<cfset copy = duplicate(url)>
<cfset structDelete(copy, "loginid")>
<cfset entries = []>
<cfloop collection="#copy#" item="key">
    <cfset arrayAppend(entries, "#key#=#copy[key]#")>
</cfloop>
<cfoutput>#arrayToList(entries, "&")#</cfoutput>