Web 应用程序链接取决于最后的反斜杠
Web app links breaking depending on final backslash
如果有人问我,我很抱歉,但我找不到它,我什至不确定我在搜索什么。
我的 Web 应用程序(托管在 google 应用程序引擎上)在 /search/ 的页面上有 links:
<a href="./details/">Details</a>
或
<a href="details/">Details</a>
只要 /search/ 有尾随反斜杠(指向 /search/details/),两者都有效,但如果 /search 缺少尾随反斜杠(而是指向 /details/),则中断
将 link 设为:
<a href="/search/details/">Details</a>
总是指向正确的位置,但这行不通,因为我有一个搜索结果模板,它们有时会出现在 /search/ 以外的页面上,并且每个页面都需要自己独特的详细信息请求处理程序。
有没有办法确保
<a href="./details/">Details</a>
语法不会中断??
感谢 deceze 的帮助,我想出了一个解决方案,即始终在我的 url 上强制使用尾部斜杠并坚持相对结构。我重定向所有没有尾部斜杠的请求:
('.*[^/]$', AddSlashHandler),
处理程序会这样做:
class AddSlashHandler(Handler):
def get(self):
if self.request.path:
red_url = self.request.path + '/'
if self.request.query_string:
red_url += '?' + self.request.query_string
self.redirect(red_url)
else:
self.redirect('/')
你只有两个选择:
- 相对路径
- 绝对路径
绝对路径以/
开头,并且始终是页面根目录的绝对路径;意思是 /foo/bar
总是解析为 http://www.example.com/foo/bar
.
相对路径不以/
开头,它们的规则有点复杂。本质上,相对路径被附加到 当前 URL 中的最后一个 /
。如果您在 /foo
,相对 URL bar
解析为 /bar
。如果您在 /foo/
,它会解析为 /foo/bar
。
这取决于您是否正确处理。通常在服务器端框架(PHP 等)中,您有一些函数可以正确生成到所需位置的绝对 URL。为此,调查 URL 路由器。因为你说你在不同的 URLs 上使用相同的页面,我怀疑你在不同的上下文中重复使用相同的模板,这意味着某种服务器端组件,所以建立一个理智的 URL 处理策略应该是你的首要任务。
如果有人问我,我很抱歉,但我找不到它,我什至不确定我在搜索什么。
我的 Web 应用程序(托管在 google 应用程序引擎上)在 /search/ 的页面上有 links:
<a href="./details/">Details</a>
或
<a href="details/">Details</a>
只要 /search/ 有尾随反斜杠(指向 /search/details/),两者都有效,但如果 /search 缺少尾随反斜杠(而是指向 /details/),则中断
将 link 设为:
<a href="/search/details/">Details</a>
总是指向正确的位置,但这行不通,因为我有一个搜索结果模板,它们有时会出现在 /search/ 以外的页面上,并且每个页面都需要自己独特的详细信息请求处理程序。
有没有办法确保
<a href="./details/">Details</a>
语法不会中断??
感谢 deceze 的帮助,我想出了一个解决方案,即始终在我的 url 上强制使用尾部斜杠并坚持相对结构。我重定向所有没有尾部斜杠的请求:
('.*[^/]$', AddSlashHandler),
处理程序会这样做:
class AddSlashHandler(Handler):
def get(self):
if self.request.path:
red_url = self.request.path + '/'
if self.request.query_string:
red_url += '?' + self.request.query_string
self.redirect(red_url)
else:
self.redirect('/')
你只有两个选择:
- 相对路径
- 绝对路径
绝对路径以/
开头,并且始终是页面根目录的绝对路径;意思是 /foo/bar
总是解析为 http://www.example.com/foo/bar
.
相对路径不以/
开头,它们的规则有点复杂。本质上,相对路径被附加到 当前 URL 中的最后一个 /
。如果您在 /foo
,相对 URL bar
解析为 /bar
。如果您在 /foo/
,它会解析为 /foo/bar
。
这取决于您是否正确处理。通常在服务器端框架(PHP 等)中,您有一些函数可以正确生成到所需位置的绝对 URL。为此,调查 URL 路由器。因为你说你在不同的 URLs 上使用相同的页面,我怀疑你在不同的上下文中重复使用相同的模板,这意味着某种服务器端组件,所以建立一个理智的 URL 处理策略应该是你的首要任务。