如何以SEO友好的方式将.aspx页面重定向到django网站上的新页面

时间:2012-11-27 15:10:50

标签: python django url seo

我正在重新设计一个从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来处理这种情况吗?

提前致谢。

3 个答案:

答案 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代码。