0

我正在重新设计一个正在从 ASPX 转换为 django 的网站。我们想像这样重定向旧网址:

/detail.aspx?ID=123

...至...

/文章/123

问题在于 url 模式匹配。我想像这样匹配旧网址的模式:

(r'^detail.aspx?ID=(?P\d+)$', 'mygreatview'),

...并从那里在视图中执行 301 重定向:

def mygreatview(request, url_id):
    article = get_object_or_404(Article, url_id=url_id)
    url = '/articles/' + article.url_id
    return HttpResponsePermanentRedirect(url)

问题是 Django 附加了一个斜杠,所以旧的 url 被转换为:

/detail.aspx/?ID=123

...在它被 urls.py 解释之前。

我尝试设置 APPEND_SLASH = False,但这似乎会导致其他 url 出现其他问题(在此处挤压气球)。

我错过了什么?我应该使用 Apache 和 mod_rewrite 来处理这种情况吗?

提前致谢。

4

3 回答 3

1

那不是你的问题。您的问题是查询参数 ( ?ID=123) 不是 URL 的一部分。您应该只匹配/detail.aspx/并获取视图中的参数request.GET['ID']

实际上,您根本不应该这样做。您的 Web 服务器配置可以更好地处理这种级别的重定向,例如在 Apache 中使用 mod_rewrite。不需要调用 Django 视图的开销来做这种事情。

于 2012-11-27T15:19:25.790 回答
0

我得到了这个工作,但我仍然对它并不完全满意,因为它是 SEO 机器人的“两步跳跃”。这是我所拥有的:

在 Apache 配置文件中:

RedirectMatch 301 ^/detail\.aspx(.*) /article$1

这会将查询字符串作为参数发送到视图:

def mygreatview(request):
    ID = request.GET['ID']
    article = get_object_or_404(Article, url_id=ID)
    url = '/articles/' + article.URL
    return HttpResponsePermanentRedirect(url)

希望我能在 1 跳中完成,但我必须使用 ID 来查找 slug。不知道我怎么能绕过那个,但应该没问题。

于 2012-11-27T18:19:09.823 回答
0

为什么不是以下?(未测试)

RewriteCond %{QUERY_STRING} ^ID=(\w+)$
RewriteRule ^/detail.aspx /articles/%1?

有关更多示例,请参见http://wiki.apache.org/httpd/RewriteQueryString

这将获取您的旧 URL 并将它们重定向到您的 django 视图,就像它期望的那样,而无需在您的 django 视图中放置任何 hacky 代码。

于 2012-11-27T18:36:47.413 回答