【问题标题】:Firebase: Pass url Param in URL RewriteFirebase:在 URL 重写中传递 url 参数
【发布时间】:2017-07-15 20:05:04
【问题描述】:

对于 firebase 文档中的代码示例,它表示要像这样启动 url 重写:

        "hosting": {
          // Add the "rewrites" section within "hosting"
          "rewrites": [ {
            "source": "**",
            "destination": "/index.html"
          } ]
        }

当我想将参数传递给索引页面时该怎么办?我试过了:

        "hosting": {
          // Add the "rewrites" section within "hosting"
          "rewrites": [ {
            "source": "/item/**",
            "destination": "/item.html?i=$1"
          } ]
        }

但这并没有做任何事情..

我也试过下面的答案:

 "hosting": {
  // Add the "rewrites" section within "hosting"
  "rewrites": [ {
    "source": "/item/:item",
    "destination": "/item.html?i=:item"
  } ]
}

但这只是返回一个 404 页面。

【问题讨论】:

  • @frank-van-puffelen - 我注意到你编辑了这个。你有解决方案吗? (还注意到您在 Firebase 工作)
  • 我认为您尝试做的事情是不可能的(重写的文档没有说明变量或占位符)。相反,请查看 Cloud Functions for Firebase 将 URL 重定向到一个函数,您可以在其中编写代码来剖析路径并生成您想要的任何响应。 firebase.google.com/docs/hosting/functions
  • 我真的不明白你为什么要这样做。斯蒂芬德莱尼的回答更有意义恕我直言

标签: firebase url-rewriting firebase-hosting


【解决方案1】:

我知道这是一个老问题,但我遇到了类似的问题,但没有找到答案,所以想分享一下我是如何解决的。

{    
    "hosting": {
    // Add the "rewrites" section within "hosting"
        "rewrites": [ {
            "source": "/item/**",
            "destination": "/item.html"
        } ]
}

我通过将动态 URL 重写为静态 html 页面解决了我的问题。由于它是重写,因此 URL 将保持为 source URL 模式,而不是像重定向那样更改为 destination URL。

然后我们可以在item.html 页面上使用 Javascript 通过window.location.pathname 读取source URL。然后您可以使用.split('/') 返回一个数组来选择您需要的部分。

希望这对寻找类似解决方案的人有所帮助。

【讨论】:

  • 有一些肮脏的黑客是的,但这一定是我见过的最肮脏的黑客:)
【解决方案2】:

我刚刚收到一封来自 Firebase 支持的电子邮件,内容如下:

从 Firebase 支持更新:

您的用例无法单独使用 Firebase 托管。您还需要使用 Cloud Functions 来执行此操作。 Firebase 最近刚刚发布了一个原生 Firebase Hosting + Functions 集成,它可以执行服务器端处理,因此您可以将 URL 重定向到一个函数,您可以在其中编写代码来剖析路径并生成您想要的任何响应。您可以查看我们的文档以详细了解它。

https://firebase.google.com/docs/hosting/functions

我已经给他们发了电子邮件,看看这是否会在未来添加,因为运行到一个页面的进程似乎有点矫枉过正。

2017 年 7 月 28 日更新

由于不支持此功能,我已为您提交了功能请求。但是,我现在无法分享任何细节或时间表。不过,我们会继续考虑您的反馈意见。

与此同时,您可以留意我们的发行说明。

祝你有美好的一天。

https://firebase.google.com/support/releases

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题。虽然重写是不可能的,但我发现 redirects 是可能的:

    "redirects": [
      {"source": "/user/friendly/url.html",
       "destination": "/userunfriendly.html?myid=42",
       "type": 301
      },
    

    【讨论】:

    • 这里不工作,我如何从源中获取 id?
    【解决方案4】:
        "hosting": {
          // Add the "rewrites" section within "hosting"
          "rewrites": [ {
            "source": "/item/:item",
            "destination": "/item.html?i=:item"
          } ]
        }
    

    试试看。

    【讨论】:

    • 这会返回 404 页面 :(
    • 如果这不起作用,那么看起来目前无法通过重写。如果它是重定向的话。这是一个选择吗?
    • 我试图不在地址栏中更改 URL,也没有指定重定向类型,例如 301 等...
    • 看起来不可能。在这种情况下,您是否尝试过查看重写函数?
    • 是的,我问过@frank-van-puffelen,但我不能指望他会听我的吩咐打电话,所以希望他能得到时间和帮助:)
    【解决方案5】:
    FireBase Allows for Static web hosting. It also has some Custom Behaviours
    
     https://firebase.google.com/docs/hosting/url-redirects-rewrites
    
    Redirects:: this is only for page forwarding 
    Rewrites:: when you want to show the same content for multiple URLs [ it is there for URL reversing ].
    It also provides control over the MIME types of the HTTP requests.
    

    现在,从上面的问题中,我看到您正在尝试从页面中查询 DOM 对象,这是动态 Web 主机提供的。

    https://www.quora.com/How-are-dynamic-websites-hosted-1

    【讨论】:

    • 静态网站有这个功能,比如下个版本的smashing mag (next.smashingmagazine.com)就有这个选项。也可以在静态网站上包含动态内容。
    • 您提到的网站是静态网站。正如您在上面所做的那样,我在next.smashingmagazine.com 网站中没有找到任何属于“ *.html?i=:item ”的网址
    • 如果您不确定,请不要对有效答案投反对票@JamesG
    • 首先,你在说什么?当然,没有带有 *.html?i=:item 的 url - 它被称为重写,它们具有保证这种行为的结构,这对于自称为开发人员的任何人来说都是显而易见的。其次,这不是一个有效的答案,您只是从网站上复制了信息,并将我引导到另一个具有同样糟糕信息的网站。您没有提供帮助或提供尚未提供的任何其他信息。最后,我没有对您投反对票,但是出于您的态度我现在有,所以现在你是-2。
    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多