Django URL // 多重斜杠被去掉(可能是Apache的问题)?

4 投票
4 回答
1960 浏览
提问于 2025-04-16 11:40

我有一个网址,它的格式是这样的:

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

这个网址应该能匹配到像这样的链接:

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

注意,有些参数缺失了,导致出现了//。这让它无法正常工作,现在我得到的链接变成了:

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

在这个链接中,缺少了必要的斜杠,这样我的格式就无法被识别了。我觉得这可能是我的Apache网络服务器做了什么,但我不太清楚该怎么找出原因。

我想知道怎么才能防止多余的斜杠被去掉,或者有没有其他方法可以处理动态数量的参数。之前这段代码运行得很好,但现在却不行了。我不太确定发生了什么变化,因为这段代码是老旧的,但我知道这种传递可变数量参数的方法是有效的。

4 个回答

1

如果你想避免在网址中看到那些难看的GET参数,而且这个somewherePage页面本身就知道会从前一个网址接收到不同数量的数据,你可以把解析网址的代码放到这个页面的代码里。

也就是说,可以把网址的格式改成这样:

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

然后在你的页面代码开始的地方进行分割:

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

我在调试一个类似的问题时遇到了这个问题,跟Django有关。多出来的斜杠总是被nginx去掉。通过在nginx的配置中添加一个 merge_slashes off 的设置,问题就解决了。

4

有没有其他方法可以处理动态数量的参数?

有的,这个方法叫做查询字符串。与其使用复杂的方式,不如用一个简单的方式(一个能匹配必要参数的方式),然后把其他的参数放在?后面,比如说example.com/foo/42?p1=foo&p2=bar。这样你就可以从request.GET中提取这些参数。

撰写回答