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('/')

你只有两个选择:

  1. 相对路径
  2. 绝对路径

绝对路径以/开头,并且始终是页面根目录的绝对路径;意思是 /foo/bar 总是解析为 http://www.example.com/foo/bar.

相对路径不以/开头,它们的规则有点复杂。本质上,相对路径被附加到 当前 URL 中的最后一个 /。如果您在 /foo,相对 URL bar 解析为 /bar。如果您在 /foo/,它会解析为 /foo/bar

这取决于您是否正确处理。通常在服务器端框架(PHP 等)中,您有一些函数可以正确生成到所需位置的绝对 URL。为此,调查 URL 路由器。因为你说你在不同的 URLs 上使用相同的页面,我怀疑你在不同的上下文中重复使用相同的模板,这意味着某种服务器端组件,所以建立一个理智的 URL 处理策略应该是你的首要任务。