我正在重新设计一个从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,但这似乎会导致其他问题(在这里挤压气球)和其他网址。
我错过了什么?我应该使用Apache和mod_rewrite来处理这种情况吗?
提前致谢。
答案 0 :(得分:1)
这不是你的问题。您的问题是查询参数(?ID=123
)不是URL的一部分。您应该与/detail.aspx/
匹配,并使用request.GET['ID']
获取视图中的参数。
实际上,你根本不应该这样做。您的Web服务器配置可以更好地处理这种重定向级别,例如Apache中的mod_rewrite。没有必要调用Django视图的开销来做这种事情。
答案 1 :(得分:0)
我让这个工作,但我仍然不完全满意它b / c它是SEO机器人的“两步跳”。这就是我所拥有的:
在Apache conf:
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。看不出我怎么能绕过那个,但应该没问题。
答案 2 :(得分:0)
为什么不以下? (尚未测试)
RewriteCond %{QUERY_STRING} ^ID=(\w+)$
RewriteRule ^/detail.aspx /articles/%1?
有关更多示例,请参阅http://wiki.apache.org/httpd/RewriteQueryString。
这会将您的旧网址重定向到您想要的django视图,而不必在您的django视图中添加任何hacky代码。