使Django URLs支持带/或不带/

5 投票
6 回答
1820 浏览
提问于 2025-04-17 10:23

我有一个Django应用程序,每个网址的配置后面都有一个斜杠(/)。比如说:

# user home page
(r'^home/$', 'user_home_page'),

不过,我发现这导致我的服务器上出现了很多重定向,因为当人们不加斜杠时,它会把他们重定向过去。有没有办法让网址同时接受有斜杠和没有斜杠的情况,而不需要重定向,除了这样做:

# user home page
(r'^home$', 'user_home_page'),
(r'^home/$', 'user_home_page'),

或者我应该避免这样配置网址吗?

6 个回答

2

我应该避免这样配置网址吗?

是的。Django已经为你处理好了这个问题。

你可以看看这个链接:https://docs.djangoproject.com/en/1.3/ref/middleware/#module-django.middleware.common

如果APPEND_SLASH设置为真,并且最初的网址后面没有斜杠,而且在网址配置中找不到这个网址,那么系统会在网址末尾加一个斜杠,形成一个新网址。如果这个新网址在网址配置中找到了,Django就会把请求重定向到这个新网址。否则,最初的网址会照常处理。

6

你可以修改一下你的 Django 设置中的 APPEND_SLASH 选项,我之前没有用过这个。

你可能会好奇,如果有人请求这个网址 /hello(也就是没有斜杠的情况),会发生什么。因为我们的 URL 规则要求必须有一个斜杠,所以这个网址就不符合规则。不过,默认情况下,任何不符合 URL 规则并且没有斜杠的请求,都会被自动重定向到加上斜杠的同一个网址。(这个行为是由 APPEND_SLASH 这个 Django 设置控制的,具体内容可以在附录 D 找到。)

这段内容来自 http://djangobook.com/en/2.0/chapter03/

8

虽然你可以通过以下方式同时接受这两种请求,而不需要进行重定向:

(r'^home/?$', 'user_home_page'),

但这样做并不是最好的搜索引擎优化(SEO)做法,因为这会让搜索引擎认为你有重复的内容,而且你的网站访问量会在这两个页面之间分散。

撰写回答