Как я могу получить 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 в домене. Если вы спрашиваете о параметрах запроса, отредактируйте ваш вопрос, так как это требует другого ответа.