Nano Hash - криптовалюты, майнинг, программирование

Не работает редирект с www на без www

У меня есть сайт, работающий на Craft CMS, я не уверен, связана ли проблема непосредственно с CMS или с сервером.

Я использую .htaccess, чтобы переписать любой URL-адрес www в версию без www.

<IfModule mod_rewrite.c>

    # (1)
    RewriteEngine On

    # (2)
    Options +FollowSymlinks

    # (3)
    #Options +SymLinksIfOwnerMatch

    # (4)
    #RewriteBase /

    # (5)
    #RewriteOptions <options>

    # (6)
    RewriteCond %{HTTPS} =on
    RewriteRule ^ - [env=proto:https]
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ - [env=proto:http]


    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA,L]

</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
#   RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>

Когда я набираю domain.com/about, он работает нормально, однако, когда я набираю www.domain.com/about, он меняет URL-адрес на domain.com/index.php?p=about

В конфигурации Craft у меня включено 'omitScriptNameInUrls' => true,, что вместе с приведенным ниже должно удалить index.php из URL-адреса.

RewriteEngine On

# Send would-be 404 requests to Craft
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]

Вот файл vhost.

<VirtualHost *:80>
    ServerName domain.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/

    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Я просмотрел https://httpd.apache.org/docs/2.4/rewrite/remapping.html#canonicalhost, но не повезло с какими-либо изменениями.

Я использую Ubuntu 16.04.1, Apache 2.4.18 и 7.0.8-0ubuntu0.16.04.3, размещенные на Ubuntu.

Есть ли что-нибудь, что я могу проверить, чтобы убедиться, что перенаправление с www на не-www работает правильно?


Ответы:


1

Вам нужно переместить этот блок перед другими выражениями:

<IfModule mod_rewrite.c>
    RewriteEngine On
#   RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>

Хотя у вас есть тег L в предыдущем, поэтому это должно быть последнее примененное правило, оно не работает (вероятно, потому что вы активируете RewriteEngine снова позже, поэтому он сбрасывает правила, но если флаг L был активен в первом правило, оно все равно не применит www).

Эмпирическое правило таково: сначала внесите косметические изменения в домен, затем примените функциональные правила.

Также не нужно открывать 2 IfModule условия. Объедините 2 в одном, как это:

<IfModule mod_rewrite.c>

    # (1)
    RewriteEngine On

    # (2)
    Options +FollowSymlinks

    # (3)
    #Options +SymLinksIfOwnerMatch

    # (4)
    #RewriteBase /

    # (5)
    #RewriteOptions <options>

    # (6)
    RewriteCond %{HTTPS} =on
    RewriteRule ^ - [env=proto:https]
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ - [env=proto:http]

#   RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]

    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA,L]

</IfModule>
10.01.2017
  • Круто, спасибо, сработало! Я реорганизую свой файл htaccess. 10.01.2017

  • 2

    Заставьте это!

    RewriteCond %{HTTP_HOST} ^domain\.com [NC]
    RewriteCond %{SERVER_PORT} 80 
    RewriteRule ^(.*)$ http://domain.com/$1 [R,L]
    
    10.01.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..