如何在ColdFusion中获取基本URL

如何在ColdFusion中获取基本URL,coldfusion,Coldfusion,我只想获取指向cfm页面的URL路径。例如,如果我的URL类似于http://125.145.23.65/test/login.cfm我需要它作为http://125.145.23.65/test/ 如果URL类似于https://localhost:8500/CFIDE/administrator/index.cfm我需要最多https://localhost:8500/CFIDE/administrator/ 如何获取此信息?可能有更好的方法,但在cgi范围脚本中,脚本名和HTTP\u UR

我只想获取指向cfm页面的URL路径。例如,如果我的URL类似于
http://125.145.23.65/test/login.cfm
我需要它作为
http://125.145.23.65/test/

如果URL类似于
https://localhost:8500/CFIDE/administrator/index.cfm
我需要最多
https://localhost:8500/CFIDE/administrator/


如何获取此信息?

可能有更好的方法,但在cgi范围脚本中,脚本名和HTTP\u URL将为您提供/test/login.cfm,HTTP\u主机和服务器名将为您提供125.145.23.65。如果您像dan所说的那样,将SCRIPT_NAME或HTTP_URL视为一个以/作为分隔符的列表,那么

<cfoutput>#cgi.server_name##Replace(cgi.script_name,ListLast(cgi.script_name, "/"),"")#</cfoutput>
更新:

因此,遵循dan的评论并使用ListDeleteAt,您可以使用

<cfoutput>#cgi.server_name##ListDeleteAt(cgi.script_name,ListLen(cgi.script_name,"/"),"/")#/</cfoutput>
#cgi.server#名称##列表删除(cgi.script#名称,列表名称(cgi.script#名称,“/”)#/

如果您需要知道其http或https服务器\u协议是否会告诉您

请记住,如果站点在负载平衡器后面进行SSL卸载,则
服务器\u端口\u安全
的值将为
0
。在这种情况下,负载平衡器可能会写入其他头文件,
CGI.X\u FORWARDED\u PROTO
,等等

这些有点标准,但有点依赖于供应商

X-Forwarded-For,X-Forwarded-Proto,X-Forwarded-Port

<cfscript>
baseUrl='http#iif(CGI.SERVER_PORT_SECURE,"s","")#://#CGI.SERVER_NAME##getDirectoryFromPath(cgi.SCRIPT_NAME)#';
writeOutput(baseUrl);
</cfscript>

baseUrl='http#iif(CGI.SERVER\u PORT\u SECURE,“s”,“”)CGI://#CGI.SERVER\u NAME##getDirectoryFromPath(CGI.SCRIPT\u NAME)#;
writeOutput(baseUrl);
试试看

<cfset varUrl = cgi.request_url>
<cfset varUrlArr = listToArray(varUrl,'/')>
<cfset x = arrayDeleteAt(varUrlArr, len(varUrlArr))>
<cfset varNewUrl = arrayToList(varUrlArr,'/')>
<cfdump var="#varNewUrl#/">

这个由Steven Levithan编写的UDF非常擅长将URL/URI分解成相应的组件,然后再重新组合成所需的组件


我执行如下操作,将url部分存储在一个数组中,以便以后进行解析。面包屑等

<!--- IIS7+ --->
<cfif CGI.HTTP_X_ORIGINAL_URL neq ''>
    <cfset request.urlStrings= listToArray(spanExcluding(CGI.HTTP_X_ORIGINAL_URL,"?"), "/")>
</cfif>
<!--- ISAPI_rewrite --->
<cfif CGI.HTTP_X_REWRITE_URL neq ''>
    <cfset request.urlStrings= listToArray(spanExcluding(CGI.HTTP_X_REWRITE_URL ,"?"), "/")>
</cfif>

将其视为带分隔符的列表。然后读这个。我自己也会使用
listdelegat
,但完成某件事的方法总是不止一种。顺便说一句,我想你在替换函数中犯了一个错误。这给了我125.145.23.65/test/all/@DanBracuk我甚至不知道有一个listdeleteat-谢谢,很高兴知道:)你是对的,我确实犯了一个错误-我会修复它。我想我以后不应该回答问题,我弊大于利!继续回答问题。虽然我这样做的真正动机是娱乐,但阅读别人的答案会带来职业发展的好处。@DanBracuk我不怎么发帖,但我喜欢阅读别人的帖子——我从这里学到了很多。我已经更新了我的帖子并尝试了listDeleteAtnice,这比我想出的乱七八糟的方法要干净得多!也可以使用三元运算符。它比iif稍微光滑一点<代码>getDirectoryFromPath(CGI.request\uURL)也可以
<!--- IIS7+ --->
<cfif CGI.HTTP_X_ORIGINAL_URL neq ''>
    <cfset request.urlStrings= listToArray(spanExcluding(CGI.HTTP_X_ORIGINAL_URL,"?"), "/")>
</cfif>
<!--- ISAPI_rewrite --->
<cfif CGI.HTTP_X_REWRITE_URL neq ''>
    <cfset request.urlStrings= listToArray(spanExcluding(CGI.HTTP_X_REWRITE_URL ,"?"), "/")>
</cfif>
#getPageContext().getRequest().getScheme()#://#cgi.server_name#/#request.urlstrings[1]#