0

ASPX から django に変換中のサイトを再設計中です。次のように古い URL をリダイレクトしたいと考えています。

/detail.aspx?ID=123

...に...

/記事/123

問題は URL パターン マッチングにあります。次のように古い 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']

実際には、それをまったく行うべきではありません。このレベルのリダイレクトは、たとえば Apache の mod_rewrite を使用して、Web サーバーの構成によってより適切に処理されます。この種のことを行うために、Django ビューのオーバーヘッドを呼び出す必要はありません。

于 2012-11-27T15:19:25.790 に答える
0

私はこれを機能させましたが、SEOボットの「2ステップホップ」であるため、まだ完全に満足していません. これが私が持っているものです:

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を使用してスラッグを検索する必要があります。どうすればそれを回避できるかわかりませんが、問題ないはずです。

于 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 ビューにリダイレクトされます。

于 2012-11-27T18:36:47.413 に答える