Puncte:0

Redirecționări condiționate multiple, toate într-un singur .htaccess (pagină de destinație)

drapel gb

Am un folder care are pur și simplu un html cu o singură pagină „Coming Soon”.

Apoi am mai multe domenii pe care le orientez din când în când către acest folder, după cum este necesar.

Simplu nu?

Ei bine, ceea ce vreau să am este o condiție în care, dacă pagina solicitată inițial a fost non-www, să merg la www (301> PLUS dacă nu https pentru a merge la https (301) ȘI apoi redirecționează tot traficul către https://www.originating-domain.xzy/index.html (302)

scopul este ca aceasta să fie o pagină de destinație pentru utilizare în scopuri multiple dar ÎNTOTDEAUNA 301 să https://www iar apoi 302 la index.html

Am deja acest non-www la www și http la https lucrând pe fiecare site:

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]

acum vreau să adaug redirecționarea 302 temp la index.html.

sau există doar o modalitate mai bună de a face acest lucru complet? ca din moment ce toate acestea sunt oricum temporare... 302 tot traficul către index Am incercat asta dar nu a mers

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
drapel kz
Doriți vreo adresă URL de ex. `https://www.example.com/whatever` pentru a afișa pagina „în curând” sau doar _pagina de pornire_ (adică, adresa URL rădăcină)?
drapel gb
da. orice merge la example.xyz/whatever pentru a redirecționa către https :// www. exemplu.xyz/index.html . deci non-www și non-https (301), dar vreau să păstrez exemplul inițial.xyz doar eliminați / whatever ca (302). Nu sunt sigur dacă explic bine.
Puncte:0
drapel kz
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

Există câteva probleme cu asta...

  1. Se pare că îți lipsește RewriteRule model (primul argument) complet, astfel încât această directivă nu se va potrivi.

  2. Dacă aceasta se potrivește, ar fi prefixul www. subdomeniu din nou. Presupun că plasezi această redirecționare după redirecționările canonice (HTTP către HTTPS și non-www către www) - așa cum ar trebui să fiți. Deci, aceasta ar redirecționa către https://www.www.example.com/index.html, deoarece în momentul în care această redirecționare este declanșată, numele de gazdă este deja canonic.

The condiție (RescrieCond directivă) nu este cu adevărat necesară, deoarece această verificare (care /index.html nu este deja solicitat) ar putea fi gestionat mai eficient de către RewriteRule directivă în sine.

De exemplu:

RewriteRule !^index\.html$ /index.html [R=302,L]

Nu este nevoie să includeți schema+numele de gazdă în substituţie șir, deoarece doriți să redirecționați la același oricum. Dacă vrei să fii explicit, poți scrie https://%{HTTP_HOST}/index.html.

Rețineți că, așa cum este, index.html nu poate face referire la niciunul altul local resurse (imagini, CSS, JavaScript etc.), deoarece aceste solicitări vor fi și ele redirecționate. Pentru a permite accesul la resursele locale, ar trebui să adăugați câteva condiții pentru a exclude cererile de resurse statice.

RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]

Alternativ, găzduiți aceste resurse pe un domeniu extern. (Sau într-un subdirector și excludeți întregul subdirector.)

Cu toate acestea, dacă aleg să „redirecționez”, probabil că aș redirecționa către un fișier cu nume mai unic/mai semnificativ, de ex. /coming-soon.html. Problema cu utilizarea /index.html este dacă mai târziu doriți să difuzați conținut diferit pe acea adresă URL și acesta a fost memorat în cache (din orice motiv). Cu toate că /coming-soon.html ar trebui să fie probabil „noindex”.

CU toate acestea, poate fi de preferat să nu redirecționați deloc și să serviți în schimb a temporar Răspuns „503 Service Unavailable”. Vedea raspunsul meu la următoarea întrebare din stiva de webmasteri pentru mai multe informații despre aceasta:


Deoparte:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

Sunteți în spatele unui proxy front-end care gestionează conexiunea SSL?

Dacă sunteți, atunci este în regulă, deși a doua condiție care verifică HTTPS variabila server este deci superfluă. Totuși, dacă ești nu în spatele unui proxy SSL, atunci aceste directive sunt vulnerabile la eludare (adică utilizatorul nu este redirecționat către HTTPS) dacă un X-Forwarded-Proto: https antetul este injectat în cerere.


ACTUALIZAȚI:

OK, asta funcționează așa cum vreau eu. Dar le pot combina într-un fel?

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]

După cum sa menționat mai sus, ultima regulă este în esență aceeași cu următoarea (atunci când este utilizată în combinație cu redirecționările canonice precedente), care este mai simplă și mai eficientă:

RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]

În a doua regulă, ar trebui să schimbați și RewriteRule model din ^(.*)$ la ^ (la fel ca prima regulă). ^(.*)$ captează în mod inutil o referință în spate și este mai puțin eficient.

Ați menționat într-un comentariu anterior (acum șters) că doriți ca acest lucru să funcționeze și pentru orice subdomeniu. „Funcționează” pentru orice subdomeniu, cu toate acestea, va adăuga întotdeauna un suplimentar www subdomeniu, care poate fi sau nu de dorit? (Nu este obișnuit să aveți un www sub-subdomeniu activat subdomenii. YMMV.)

Nu este nevoie reală de a „combina” aceste reguli. Cu siguranță nu le puteți combina dacă doriți să redirecționați 301 către www+HTTPS înainte de a redirecționa 302 către pagina „în curând”. În timp ce primele două reguli (301 redirecționări) pot fi „combinate” într-o singură regulă, aceasta nu servește la nimic.

Singura problemă minoră aici este că există potențial (cel mult) 2 redirecționări. Mai întâi, un 301 către www+HTTPS pe calea URL originală și un al doilea 302 către pagina „în curând”.

M-aș întreba dacă aveți nevoie de redirecționarea inițială 301 către www+HTTPS atunci când oricum redirecționați utilizatorul către un temporar pagina „în curând”.Odată ce ați implementat noul site (înlocuind pagina „în curând”), atunci veți implementa redirecționarea canonică. Redirecționarea 302 poate redirecționa în continuare către www+HTTPS. (Există, totuși, un caz limită când /coming-soon.html este solicitat direct.)

De exemplu:

# 302 redirecționează către pagina viitoare (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]

# Carcasa Edge...
# Următoarele două reguli se aplică numai dacă „/coming-soon.html” este solicitat direct
# și este solicitat fie numele de gazdă non-www și/sau HTTP
# în acest caz 301 redirecționează către același pe www+HTTPS

Lipsește subdomeniul # www...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# HTTP + www a fost solicitat
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Orice cerere pentru http://example.com/foo este 302 redirecționat direct către https://www.example.com/coming-soon.html.

Dacă http://example.com/coming-soon.html ar trebui solicitat, atunci este redirecționat către 301 https://www.example.com/coming-soon.html (doar se repară subdomeniul HTTPS și www).

Există cel mult 1 redirecționare externă.

Puncte:0
drapel gb

OK, asta funcționează așa cum vreau eu. Dar le pot combina într-un fel?

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]
drapel kz
Mi-am actualizat răspunsul pentru a aborda acest lucru.
drapel kz
Vă rugăm să luați în considerare „acceptarea” răspunsului meu (pentru a ajuta alți cititori și pentru a elimina întrebarea din coada de întrebări fără răspuns) și a vota dacă vi se pare util. Multumesc, foarte apreciat :)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.