Правило перезаписи в файле .htaccess не работает для поддомена основного домена

#.htaccess #redirect #subdomain

#.htaccess #перенаправление #поддомен

Вопрос:

По сути, у моей компании, в которой я работаю, есть сайт, на котором размещены страницы для нескольких разных магазинов. У каждого магазина есть свое собственное правило поддомена в cpanel, чтобы пользователи могли вводить простой URL-адрес из листовки, чтобы перейти на сайт своего локального магазина. Однако недавно Bing начал индексировать один из наших поддоменов, что вызывает некоторую путаницу у наших клиентов, поскольку ссылка отображается как https: // [citystate] .example.com/find-us/altstate/altcity

Я просмотрел несколько файлов и дошел до того, что, судя по тому, что я видел, должно работать, но не работает.

 RewriteCond %{HTTP_HOST} ^[citystate].example.com
RewriteRule ^(.*)$ https://example.com/$1 [L]
  

Может кто-нибудь, пожалуйста, помочь в том, где я ошибаюсь?

ОБНОВЛЕНИЕ: приведенная выше часть работает, но URL перенаправляется на индексную страницу, потому что страница отображается так, как будто ее не существует. Однако, если я возьму ссылку и открою ее в отдельном окне / вкладке браузера, она откроется. Цвет меня смутил.

Комментарии:

1. Хорошо. Итак, я обнаружил, что мне нужна эта часть, чтобы захватить сайт и изменить его направление. Перезаписать второй %{HTTP_HOST} ^[citystate].example.com RewriteRule ^(.*)$ example.com /$1 [L] Однако конечная часть URL-адреса удаляется, и сайт по умолчанию переходит на индексную страницу. Есть ли способ передать фрагмент URL, который появляется после example.com /[все это]? Редактировать: попытка отформатировать комментарий для удобства чтения

2. Пожалуйста, отредактируйте свой вопрос, чтобы включить эту дополнительную информацию. Если код не отформатирован правильно, специальные символы отсутствуют, и их трудно прочитать.

3. @MrWhite, обновил условие перезаписи и правило перезаписи.

4. «конечная часть URL-адреса удаляется, и сайт по умолчанию переходит на индексную страницу» — ваш обновленный пример кода уже делает это. Возможно, у вас конфликт с другими директивами в вашем .htaccess файле? Пожалуйста, укажите содержимое вашего .htaccess файла в вашем вопросе с учетом этих директив.

5. @MrWhite, ты был прав. Условие перезаписи, установленное для случая, когда файл не найден, возвращало его на страницу индекса. Теперь, что не имеет смысла, так это то, что URL-адрес работает, но он не может открыть страницу, если перенаправлен таким образом. (ИЗ) example.com/find-us/state (КОМУ) example.com/find-us/state Если я открываю сайт по этой ссылке, он работает, но не через редирект.

Ответ №1:

 RewriteCond %{HTTP_HOST} ^[citystate].example.com
RewriteRule ^(.*)$ https://example.com/$1 [L]
  

Это правило должно располагаться в верхней части вашего .htaccess файла, чтобы избежать конфликтов с другими директивами.

Однако есть несколько потенциальных проблем:

  • Фрагмент регулярного [citystate] выражения соответствует только одному символу в классе символов. [ и ] обозначает класс символов. Таким образом, это соответствует либо c , i , t , y , s , t , a либо e — только один символ. Вам нужно указать слово буквально, без квадратных скобок. Однако, если у вас много «городов», то для этого требуется правило для каждого города, вы можете сделать регулярное выражение более общим, чтобы соответствовать любому городу. например. [a-z] (т.е. 1 или более строчных букв в диапазоне a до z .)

  • Вам не хватает флага R ( redirect ) в файле RewriteRule . eg. [R,L] or [R=301,L] . Однако, поскольку вы указали схему имя хоста в целевом URL, это неявно вызовет 302 (временное) перенаправление, что нормально. Однако, чтобы решить проблему с Bing, это должно быть 301 (постоянное) перенаправление. Но сначала протестируйте с 302 (временными) перенаправлениями, чтобы избежать потенциальных проблем с кэшированием.

Незначительные проблемы:

  • ^(.*)$ — регулярное выражение по умолчанию является жадным, поэтому ^ привязки и $ (начало и конец строки) являются излишними.

  • Нет необходимости в RewriteRule замене буквальных точек и косых черт с обратной косой чертой, поскольку это «обычная» строка, а не регулярное выражение.

Вместо этого попробуйте следующее:

 RewriteCond %{HTTP_HOST} ^[a-z] .example.com
RewriteRule (.*) https://example.com/$1 [R=301,L]
  

Если URL-путь неправильно фиксируется $1 обратной ссылкой, вместо этого вы можете использовать переменную REQUEST_URI сервера. Например:

 RewriteCond %{HTTP_HOST} ^[a-z] .example.com
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
  

Обратите внимание, что REQUEST_URI переменная сервера содержит префикс косой черты, поэтому он опущен в строке подстановки.

Комментарии:

1. ты мужик! Оказывается, мне нужно было добавить фрагмент в более высокую точку файла, как вы упомянули, и это работает блестяще. Решаемая