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 的错)?的主要内容,如果未能解决你的问题,请参考以下文章