Django官方文档和Web上的其他教程总是在url的末尾使用尾部斜杠。例如:
url(r'^accounts/login/', views.login) # login view in turn calls login.html
# instead of
url(r'^accounts/login', views.login)
由于accounts
是目录而login (login.html)
是文件,我们不应该使用第二个网址吗?这也将使GET
参数看起来更有条理:
accounts/login?name='abc' # login is a file that is accepting parameters
vs.
accounts/login/?name='abc' # login directory (maybe index) is accepting parameters??
答案 0 :(得分:16)
Django的core design philosophies之一是网址应该很漂亮。
因此,像 accounts/detail?name='abc'
这样的网址应该映射为 accounts/detail/abc/
。您可以在网址配置中使用正则表达式捕获它。这里的URL非常整洁,用户友好。这将有助于搜索引擎正确索引您的网页(现在您可以忘记rel=canonical
)并在seo中提供帮助。
现在是一个尾随斜杠的原因,考虑一个视图(在任何框架中)相对为路径上的用户 about.html
解析 users/awesomeUser
强>
由于users/awesomeUser
和users/awesomeUser/
不同,
如果用户位于users/awesomeUser
,则浏览器会将其解析为users/about.html
,因为我们不想要
如果用户位于users/awesomeUser/
,则浏览器会将其解析为users/awesomeUser/about.html
,因为有一个尾随斜杠
相对于
child
的- 相对于
family/parent/
为family/parent/child
。child
的family/parent
为family/child
。
从技术上讲, foo.com/bar 和 foo.com/bar / 是两个不同的网址和搜索引擎机器人(以及一些网络流量分析工具)将它们视为单独的页面。 Django应该努力“规范化”URL,以便搜索引擎机器人不会混淆。
这是APPEND_SLASH设置背后的原因。(APPEND_SLASH允许您强制向网址添加斜杠)
user/awesomeUser
和user/awesomeUser/
为同一网页保留两份副本。您不能使POST / PUT / PATCH / DELETE方法与rest_framework
一起使用,除非您在设置中明确定义APPEND_SLASH=False
并为每个路由器明确定义trailing_slash=False
使用(如果您使用路由器)。 就像你基本上要跳过这个次数而且你要浪费很多时间来调试它。 Django建议append slashes
并且不强迫它。
由开发人员决定是否添加斜杠。
答案 1 :(得分:1)
这有助于定义您网站的结构。虽然django可以支持在传递给服务器的域之后输入的任何内容,但这样做可以让您轻松添加"子页面"到没有它看起来像accounts/loginreset?id=alkfjahgouasfjvn25jk1k25
在上述案例中,如果将其排除在外可能是有意义的。
答案 2 :(得分:1)
从the docs获取使用APPEND_SLASH
搜索引擎索引器会将它们视为单独的网址 - 因此最佳做法是对网址进行规范化。
它不是django所要求的,它只是通过建议一种标准的网址方式来帮助你的搜索引擎优化。
是的,我知道斜杠与此中间件无关,但这是我可以找到的最佳解释,可能的原因
答案 3 :(得分:0)
“ URL应该很漂亮” !!! 我希望能够控制URL。当一切都将被覆盖时,这没什么好说的。在这种情况下,我会创建一个重定向循环,这很有趣。
from django.http import HttpResponseRedirect as rdrct
url(r'^sitemap.xml$', 'my_app.views.custom_sm'),
url(r'^sitemap.xml/$', lambda x: rdrct('/sitemap.xml')),