![Несколько условных перенаправлений в одном .htaccess (целевая страница)](https://rvso.com/image/770104/%D0%9D%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%8B%D1%85%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%BC%20.htaccess%20(%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0).png)
У меня есть папка, в которой просто находится одностраничный html-код «Скоро в продаже».
Затем у меня есть несколько доменов, которые я время от времени по мере необходимости указываю на эту папку.
Все просто, правда?
Ну, я хочу иметь условие, при котором, если исходная запрошенная страница была без www, то переход на www (301> ПЛЮС, если не https, то переход на https (301) И затем перенаправлять весь трафик на https://www.originating-domain.xzy/index.html
(302)
цель состоит в том, чтобы сделать эту страницу целевой для многоцелевого использования, но ВСЕГДА 301 на https://www
и затем 302 наindex.html
У меня уже есть работающие на каждом сайте преобразования без www в www и http в https:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
Теперь я хочу добавить временное перенаправление 302 на index.html
.
или есть просто лучший способ сделать это полностью? например, поскольку это все временно в любом случае... 302 весь трафик на индекс Я пробовал это, но не сработало
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
решение1
RewriteCond %{REQUEST_URI} !.*index\.html RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
В связи с этим есть несколько проблем...
Вы, кажется, упускаете из виду
RewriteRule
шаблон(первый аргумент) полностью, поэтому эта директива не будет соответствовать.Если бы это совпало, то это был бы префикс
www.
поддоменаснова. Я предполагаю, что вы устанавливаете это перенаправлениепослеканонические перенаправления (HTTP на HTTPS и не-www на www) - как и должно быть. Итак, это перенаправит наhttps://www.www.example.com/index.html
, потому что к моменту срабатывания этого перенаправления имя хоста уже каноническое.
Theсостояние( RewriteCond
директива) на самом деле не нужна, поскольку эта проверка (которая /index.html
еще не запрошена) могла бы быть более эффективно выполнена RewriteRule
самой директивой.
Например:
RewriteRule !^index\.html$ /index.html [R=302,L]
Нет необходимости включать схему+имя хоста взаменаstring, поскольку вы хотите перенаправить на то же самое в любом случае. Если вы хотите быть явными, вы можете написать https://%{HTTP_HOST}/index.html
.
Обратите внимание, что в его нынешнем виде он index.html
не может ссылаться ни на какой другойместныйресурсы (изображения, CSS, JavaScript и т. д.), поскольку эти запросы также будут перенаправлены. Чтобы разрешить доступ к локальным ресурсам, вам нужно будет добавить пару условий, чтобы исключить запросы на статические ресурсы.
RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]
В качестве альтернативы разместите эти ресурсы на внешнем домене. (Или в подкаталоге и исключите весь подкаталог.)
Однако, если бы я вообще выбирал «перенаправление», я бы, возможно, перенаправил на файл с более уникальным/значимым именем, например. /coming-soon.html
. Проблема с использованием /index.html
заключается в том, что если вы позже захотите предоставить другой контент по этому URL, а он был кэширован (по какой-либо причине). Хотя, /coming-soon.html
вероятно, должно быть «noindex».
ОДНАКО, может быть предпочтительнее вообще не перенаправлять, а вместо этого податьвременныйОтвет "503 Service Unavailable". Смотретьмой ответна следующий вопрос в разделе «Веб-мастера» для получения дополнительной информации по этому вопросу:
В стороне:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
Вы используете прокси-сервер, который управляет SSL-соединением?
Если вы, то это нормально, хотя второе условие, которое проверяет HTTPS
переменную сервера, поэтому излишне. Однако, если вынетза SSL-прокси, то эти директивы уязвимы для обхода (т.е. пользователь не перенаправляется на HTTPS), если X-Forwarded-Proto: https
в запрос внедрен заголовок.
ОБНОВЛЯТЬ:
Хорошо, это работает так, как я хочу. Но могу ли я объединить их каким-то образом?
RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
Как отмечено выше, последнее правило по сути то же самое, что и следующее (при использовании в сочетании с предыдущими каноническими перенаправлениями), которое проще и эффективнее:
RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]
Во втором правиле вам также следует изменитьRewriteRule
шаблонот ^(.*)$
до ^
(то же самое, что и первое правило). ^(.*)$
без необходимости захватывает обратную ссылку и менее эффективно.
Вы упомянули в предыдущем комментарии (теперь удаленном), что вы хотели, чтобы это работало для любого поддомена. Это «работает» для любого поддомена, однако, это всегда будет добавлять дополнительный www
поддомен, что может быть или не быть желательным? (Необычно иметь www
под-поддомен наподдомены. YMMV.)
Нет никакой реальной необходимости "объединять" эти правила. Вы определенно не можете их объединить, если хотите сделать 301-редирект на www+HTTPS перед 302-редиректами на страницу "скоро". Хотя первые два правила (редирект 301) можно "объединить" в одно правило, это бесполезно.
Единственная незначительная проблема здесь в том, что потенциально (максимум) есть 2 перенаправления. Первое, 301 на www+HTTPS на исходном URL-пути и второе 302 на страницу «скоро».
Я бы усомнился, действительно ли вам нужна первоначальная переадресация 301 на www+HTTPS, когда вы в любом случае перенаправляете пользователя навременный"скоро" страница. После того, как вы внедрили новый сайт (заменив страницу "скоро"), вы должны внедрить канонический редирект. Редирект 302 все еще может перенаправлять на www+HTTPS. (Однако есть крайний случай, когда /coming-soon.html
запрашивается напрямую.)
Например:
# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]
# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS
# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Любой запрос на http://example.com/foo
302 перенаправляется напрямую на https://www.example.com/coming-soon.html
.
Если http://example.com/coming-soon.html
необходимо, то выполняется перенаправление 301 https://www.example.com/coming-soon.html
(просто исправление HTTPS и поддомена www).
Возможно не более 1 внешнего перенаправления.
решение2
Хорошо, это работает так, как я хочу. Но могу ли я объединить их каким-то образом?
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]