Firebase:在URL重写中传递URL参数

11
在 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 工作) - JamesG
3
我不认为你试图做的事情是可能的(重写文档中没有关于变量或占位符的内容)。相反,建议你研究Firebase云函数,将URL重定向到一个函数,在这个函数中你可以编写代码来解析路径并生成任何你想要的响应。https://firebase.google.com/docs/hosting/functions - Doug Stevenson
我真的不明白你为什么想这样做。在我看来,Stephen Delaney的答案更有道理。 - eddyP23
5个回答

9

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

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

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

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

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


4
有一些肮脏的黑科技,但这一定是我见过最肮脏的黑科技 :) - Ayyash
1
实际上一点也不俗气。这基本上是解析GET请求的方法。非常聪明的解决方案! - Jacob Wood

3

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

Firebase支持更新:

使用Firebase Hosting无法实现您的用例。您需要同时使用Cloud Functions。Firebase最近发布了原生Firebase Hosting +函数集成,可以进行服务器端处理,因此您可以将URL重定向到一个函数,其中您可以编写代码来解析路径并生成任何所需的响应。您可以查看我们的文档以了解更多详细信息。

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

我已经回复他们,想知道这是否是将来会添加的内容,因为运行两个进程似乎有些过度。

更新 28/07/2017

由于此功能目前不受支持,我已经为您提交了一个功能请求。但是,我目前无法分享任何细节或时间表。我们将保留您的反馈并考虑其发展方向。

在此期间,您可以关注我们的发布说明。

祝您有美好的一天。

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


0

我也遇到了同样的问题。虽然这在重写中不可能实现,但我发现可以通过重定向实现:

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

这里不起作用,我该如何从源代码中获取ID? - Guilherme Simão Couto

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

试一试吧。


这会返回404页面 :( - JamesG
如果这不起作用,那么似乎使用重写目前是不可能的。如果使用重定向,那就可以了。这是一个选项吗? - Chris Johnston
我正在尝试让地址栏中的URL保持不变,也不指定重定向类型,例如301等。 - JamesG
我刚刚看了一下。看起来可能是可行的,但是我真的不想每次根据ID从数据库获取数据时都要触发一个云函数。使用两个服务似乎有点傻,你同意吗? - JamesG
1
是的,我问过@frank-van-puffelen了,但我不能指望他随叫随到,希望他有时间并能提供帮助:) - JamesG
显示剩余2条评论

-2
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 (https://next.smashingmagazine.com/) 就有这个选项。同时,在静态网站上也可以拥有动态内容。 - JamesG
请不要在你不确定的情况下对一个有效的答案进行负评 @JamesG - Aloy A Sen
首先,你在说什么?当然没有带有*.html?i=:item"的URL - 这被称为重写,它们具有需要这种行为的结构,对于任何自称为开发人员的人都是显而易见的。其次,这不是一个有效的答案,你只是从网站上复制了信息,并将我引导到另一个同样糟糕的信息网站。你没有提供任何其他还未提供的信息或提供帮助。最后,我没有给你投反对票,但因为你的态度,我现在已经给你投了负2票。 - JamesG

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