如何从Classic ASP请求中获取*实际*客户端URL?

4

尝试在旧的(Classic) ASP网站上进行一些SEO优化。

主页长期以来一直是home.asp,但我们希望所有入站链接都指向网站根目录("/")。已经对页面进行了更改,但现在我们需要进行重定向,以避免损坏传统的入站链接。

我基本上想做到这一点:

<% if Request.ServerVariables("PATH_INFO") = "/home.asp" then
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.mysite.com/"
end if %>

问题在于,即使我进入站点根目录,PATH_INFO、SCRIPT_NAME和PATH_TRANSLATED变量仍然都返回“/home.asp”,导致不断重定向并陷入无休止的循环。
有什么想法吗?
编辑
为了澄清,我知道IIS中默认文档设置为home.asp,并已经考虑过建议的解决方法。但是,我目前没有更改它的权限,这就是我在这里询问是否有办法询问ASP客户端使用的URL的原因。看起来没有办法做到这一点,所以我将申请访问更改欢迎页面为其他内容。

1
Request.ServerVariables("URL")不能给你正确的值吗? - RobV
6个回答

2
据我理解,您想在浏览器地址包含 "/home.asp" 时将地址值更改为 "/"。例如:
http://www.sitename.com/?some=querystring

替代

http://www.sitename.com/home.asp?some=querystring

在经典的asp中,脚本在将结果发送给客户端之前在服务器上运行,因此无法在执行代码之前收集浏览器地址值,但是可以使用JavaScript等客户端脚本语言。使用Request.ServerVariables和"URL"、"PATH_INFO"、"PATH_TRANSLATED"等选项就行不通,因为它们应该返回“工作时”的脚本名称(asp页面)。
但是有一种方法可以将所有旧的home.asp页面重定向到新的根URL。您可以针对站点的新版本使用简单的查询字符串检查。例如:
如果旧地址类似于:
"http://www.sitename.com/home.asp?some=querystring&more=querystring"

然后将其重定向到:

"http://www.sitename.com/?ver=2&" & Request.QueryString

在脚本中,您可以检查 querystring("v")=2 是否为真来确定地址是否来自新版本,否则将其重定向到/?v=2,无论之前的URL是什么。


2
我会创建一个新的默认文档来提供主页,例如 index.asp,并确保将 index.asp 设置为 IIS 中最顶层的默认文档。

1

Request.ServerVariables("URL")不能给你正确的值吗?

据我所知,那应该是用户实际发出的HTTP请求的URL。


1
它并不是这样的。例如,如果浏览器请求www.nowhere.com/,默认页面为index.asp,那么URL服务器变量就是/index.asp - Keith

1

他们返回home.asp的原因是因为在IIS配置中,网站的默认内容文档将列出home.asp在您拥有的其他页面之上,可能也包括您想要的页面。

尽管HTTP允许您请求目录...例如http://www.example.com/,但几乎所有服务器都会为此文档提供站点中的一个页面,通常称为default.*或index.*(其中*是由服务器处理的任何内容类型扩展名)。

从“文档”选项卡中删除home.asp将防止无限循环,但您可能会发现自己不小心破坏了您的网站。


1

您可以在页面首次重定向时创建一个会话对象,然后在再次重定向之前检查该会话(虽然我已经有几年没使用过经典 ASP,但这应该可行):

<% 
if Request.ServerVariables("PATH_INFO") = "/home.asp" AND NOT Session("HasBeenHere") then
  Session("HasBeenHere") = True
  Response.Status="301 Moved Permanently"
  Response.AddHeader "Location","http://www.mysite.com/"
end if 
%>

+1,但你真的应该在IF语句之前获取Session的值,并将其作为字符串进行比较,否则第一次运行它时会崩溃,因为你正在尝试将null转换为布尔值。 - RobV
在经典的ASP/VBScript中,如果Session没有被设置,它将会评估为False。也许在VB6中你需要先进行类型转换? - Metro Smurf

1

要检查的一件事是默认列表中是否有比home.asp更高的文档。如果您没有管理访问权限,可以尝试创建类似以下页面:

index.asp
default.asp

等等等等。如果您可以找到一个比home.asp具有更高优先级的文件名,则可以将home.asp中的内容复制到此新文件中,并将home.asp更改为仅重定向到根目录。

如果home.asp是列表中最高的条目,则我唯一能建议的就是输出完整的HTTP标头列表,并比较访问/与访问/home.asp时生成的输出。希望您能发现一个区别,您将能够利用它。

<%
  for each header in Request.ServerVariables
      response.write header & " : " & Request.ServerVariables(header) & "<br />"
  next
%>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接