Как я могу получить Django Absolute url без "www" в домене?

Я пытаюсь добавить действительный канонический тег на мой сайт Django. Поэтому я должен добавить канонический URL без параметра запроса. Я нахожу красивое решение, но у меня есть проблема, которую я не могу решить. Мой тег выглядит так:

{% if request.GET %}
  <link rel="canonical" href="https://{{ request.get_host }}{{ request.path }}">
{% endif %}

Это хорошее решение, но в реальном сайте на странице с URL https://example.com/about-us?page=3 Я получаю этот канонический URL https://www.example.com/about-us

Почему я получаю канонический URL с www перед доменом сайта

Это мой ALLOWED_HOST в settings.py:

ALLOWED_HOSTS = [
    '127.0.0.1',
    'www.example.com',
    'example.com',
    'localhost',
]

Как я могу получить действительный канонический URL без www?

1 ответ

Решение

Потому что вы используете request.get_hostэто будет разрешать все, что пользователь ввел в браузер. Возможно, ваши DNS-записи настроены на прием домена с или без www. Django не заботится о том, какой домен он обслуживает, за исключением случаев, когда вы используете его платформу Sites (ваш пример кода не касается фреймворка Sites, поэтому я полагаю, что это не так) Поэтому Django отвечает только на основе URL-пути и игнорирует домен.

Вы спрашиваете, можете ли вы удалить "www" из входящего запроса? Конечно, вы можете сделать это на уровне веб-сервера (apache/nginx и т. Д.) С перенаправлениями, специфичными для этих веб-серверов. Или вы можете пропустить запрос через веб-сервер и перехватить его на уровне сервера приложений (Django) с помощью специального промежуточного программного обеспечения. Вот пример этого.

Обратите внимание, что вы не можете использовать приложение Redirects, встроенное в Django, потому что оно работает только на путях, тогда как вы хотите манипулировать самим входящим доменом.

Итак, ваш выбор: настроить ваш веб-сервер или добавить модуль промежуточного программного обеспечения в ваш проект Django.

ALLOWED_HOSTS Настройка не связана с вашим вопросом.

В стороне: Ваш вопрос немного сбивает с толку, потому что вы сначала спрашиваете об удаленном параметре запроса ?page=3 но затем вы переключаетесь на вопрос о www в домене. Если вы спрашиваете о параметрах запроса, отредактируйте ваш вопрос, так как это требует другого ответа.

Другие вопросы по тегам