我有一个 url.LoginID,当用户单击链接登录时,我想将其从地址栏中删除。 它必须是书签,不能是表单提交。
问:如何从 Index.cfm 中删除 ?LoginID?LoginID=XYZ&AssignmentID=123
这可能是这样的:
<cflocation url="#cgi.SCRIPT_NAME#?#cgi.QUERY_STRING#" addtoken="no">
看来您走在正确的道路上。
如果登录 ID 是查询字符串中唯一的内容,您可以简单地 cflocation 到目标页面,而无需查询字符串。
如果查询字符串中有其他数据,那么你可以这样做:
<cfset q = reReplaceNoCase(cgi.query_string, "LOGINID=[^&]+&?", "")>
<cflocation url="#cgi.SCRIPT_NAME#?#q#">
这实际上会删除 loginid 和所有内容,直到字符串的 en 或下一个 URL 变量。
像往常一样,CFLIB 上已经有人编写了一个 UDF: queryStringDeleteVar
然后你就可以这样做
<cflocation
url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID",cgi.QUERY_STRING)#"
addtoken="no"
>
CGI.QUERY_STRING 实际上是第二个参数的默认值,所以这也同样有效
<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 ([email protected])
*
* @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 ([email protected]@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>
有多种方法可以做到这一点,这里是一种使用列表循环来读取现有参数并检查您想要忽略的参数的方法:
<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">
希望有帮助!
假设您真的不想删除
?
来保持 URL 有效,那么简单的正则表达式应该可以工作:
QUERY_STRING = ReReplaceNoCase(cgi.QUERY_STRING, "LoginID=.+\&", "");
顺便说一句,我不确定你为什么要在 URL 中保留
LoginID
,这可能是不安全的方法。使用会话听起来是一个更好的主意。
编辑:Ben 的正则表达式更好,因为我的版本非常简单,会“吃掉”最后一对之前的所有
key=value
对。
插入著名的 Zawinski 两个问题正则表达式引用并以不同的方式解决:
<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>
我已经使用这种代码很多年了,没有任何问题:
<cfset zurl = #cgi.SCRIPT_NAME#&'?'&#cgi.QUERY_STRING#>
<cfset arg2remove = 'LoginID='&#url.LoginID#>
<cfset q = reReplaceNoCase(cgi.query_string, arg2remove, "")>
不需要使用正则表达式。