Django URL // 双斜杠被删除(可能是 Apache 的错)?

Posted

技术标签:

【中文标题】Django URL // 双斜杠被删除(可能是 Apache 的错)?【英文标题】:Django URL // double slash being dropped (Possibly Apache's fault)? 【发布时间】: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 网络服务器正在做的事情引起的,但我不知道如何解决这个问题。

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

【问题讨论】:

【参考方案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 中提取它们。

【讨论】:

谢谢。这正是我要做的。我发现的几乎所有内容都表明放置一堆 /// 是一个糟糕的主意,所以我将继续修复它。

以上是关于Django URL // 双斜杠被删除(可能是 Apache 的错)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 apache 2.4 的 url 中删除双斜杠//?

如何在模板中删除 django URL 中的尾随斜杠?

通过 .htaccess 从 URL 中删除双斜杠不起作用

在 URL 中使用双斜杠有啥缺点吗?

url前面双斜杠单斜杠无斜杠点+单斜杠的总结

Htaccess:从URL添加/删除尾部斜杠