【问题标题】:Django URL // double slash being dropped (Possibly Apache's fault)?Django URL // 双斜杠被删除(可能是 Apache 的错)?
【发布时间】:2011-06-25 21:11:56
【问题描述】:

我有一个这样的 url:

('^(?i)somewhere/(\d+)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/$', somewherePage),

它应该在哪里获取如下 URL:

http://foo.com/somewhere/1337/foo/params/that/are//maybe///used/

请注意某些参数不存在并导致 //。这已经停止工作,而不是正确的网址,我得到的是:

http://foo.com/somewhere/1337/foo/params/that/are/maybe/used/

所需的斜线不存在,然后我的模式就无法识别。我认为这可能是由我的 apache 网络服务器正在做的事情引起的,但我不知道如何解决这个问题。

我的问题是如何阻止多余的斜线被删除,或者是否有另一种解决方案来获得动态数量的参数。此外,这段代码过去工作正常,但感觉停止了。由于代码库是遗留的,我不确定发生了什么变化,但我知道这种传递可变数量参数的方式是有效的。

【问题讨论】:

    标签: python regex django apache url


    【解决方案1】:

    在 Django 上调试类似问题后,我遇到了这个问题。由于 nginx,额外的斜线总是被丢弃。在 nginx 配置中添加 merge_slashes off 解决了这个问题。

    【讨论】:

      【解决方案2】:

      如果你想避免 GET 参数的丑陋,并且由于这个 somewherePage 视图隐含地知道期望从引用 url 返回可变数量的片段,你可以将 url 解析代码转移到视图本身。

      也就是说,让url模式像:

      ('^(?i)somewhere/(\d+)/(.*)/$', somewherePage),
      

      并在视图的开头拆分它:

      def somewherePage(request, somewhere_int, somewhere_pieces):
          import string
          the_pieces = string.split(somewhere_pieces, '/')
      

      【讨论】:

        【解决方案3】:

        导致多余的 // 被删除的答案是来自 mod_rewrite Apache 模块的一些命令。我决定按照 PiotrLegnica 的建议修复创建 URL 的方式。

        【讨论】:

          【解决方案4】:

          是否有另一种解决方案来获得动态数量的参数

          是的,它被称为查询字符串。代替那种丑陋的模式,使用更简单的模式(匹配所需参数的模式),并在? 之后传递其他所有内容,例如example.com/foo/42?p1=foo&p2=bar。 然后您可以从request.GET 中提取它们。

          【讨论】:

          • 谢谢。这正是我要做的。我发现的几乎所有内容都表明放置一堆 /// 是一个糟糕的主意,所以我将继续修复它。
          猜你喜欢
          • 2016-08-07
          • 2018-08-14
          • 2017-05-03
          • 1970-01-01
          • 1970-01-01
          • 2021-07-06
          • 2014-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多