8

django/pythonのスタックオーバーフローに似たURLスキームを実装しようとしています。

たとえば、pkはタイトルのスラッグと一緒にURLに保存されるため、この質問(id#4787731)のURLは次のようになります。

https://stackoverflow.com/questions/4787731/canonical-links-and-301-redirect-if-url-doesnt-match-slug

後でタイトルを変更した場合(またはURLにランダムなクラッドを入れた場合)、サイトは(IDによって)どの質問を探しているかを認識し、正しいURLにリダイレクトします(例:試してみてください)。

https://stackoverflow.com/questions/4787731/canonical-links-MODIFIED-URL

それで

  • 次のような私のページに正規リンクを含めるための最良の方法は何ですか

    <link rel = "canonical" href = "https://stackoverflow.com/questions/4787731/canonical-links-and-301-redirect-if-url-doesnt-match-slug">

(get_absolute_urlを使用できますか)

  • 現在のURLが正規リンクと一致しないことを認識し、301を発行するための最良の方法は何ですか?

注-この質問は似ていますが、スラグをオンザフライまたは静的に生成する場合にのみ対処します。

4

2 に答える 2

6

1:とにかく301があれば、正規タグを使用する意味はないと思います。

URLをからに変更するシナリオを想像してみましょ/q/111/hello-world/q/111/foobar。エンジンは、正規タグが指している元のURLにアクセスしない限り、2つが等しいとは想定しません/q/111/foobar(現在は301であり、ページ間の関係の証拠を切断しているため、これは想定されません)。

2:私はそれを簡単な方法で行います。一意でないslugフィールドを定義し、詳細ビューでキャプチャされたURLと比較します。

# models
class MyModel(models.Model):
    # ...
    non_unique_slug = models.SlugField()

    def get_absolute_url(self):
        return "/questions/%s/%s" % (self.id, self.non_unique_slug)


# urls
    r'^questions/(?P<id>\d+)/(?P<slug>[\w-]+)/$' 

# views
def my_view(request, id, slug):
    page = Page.objects.get(id=id)
    if not slug == page.slug:
        return http.HttpResponsePermanentRedirect(page.get_absolute_url())

    # render page
    return direct_to_template(request, "foobar.html", {'page': page})
于 2011-01-25T01:01:31.643 に答える
1

HttpResponsePermanentRedirectYujiの役立つ指示に従いましたが、一時的な302ではなく永続的な301を取得するには、オブジェクトを 使用する必要があることがわかりました。

于 2012-01-19T06:22:11.867 に答える