Reindirizzamento di URL non www a www utilizzando .htaccess
-
09-06-2019 - |
Domanda
sto usando Riscrittura ISAPI di Helicon 3, che sostanzialmente abilita .htaccess in IIS.Devo reindirizzare un URL non www alla versione www, ad es.example.com dovrebbe reindirizzare a www.example.com.Ho utilizzato la seguente regola dagli esempi ma influisce sui sottodomini:
RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]
Funziona per la maggior parte, ma reindirizza anche sub.example.com a www.sub.example.com.Come posso riscrivere la regola di cui sopra in modo che i sottodomini non vengano reindirizzati?
Soluzione
Aggiungi il seguente RewriteCond:
RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]
In questo modo applicherà la regola solo a nondottedsomething.uptofiveletters, come puoi vedere, subdomain.domain.com non corrisponderà alla condizione e quindi non verrà riscritto.
Puoi modificare [a-z]{2,5} per una regex di corrispondenza tld più rigorosa, oltre a posizionare tutti i vincoli per i caratteri consentiti nei nomi di dominio (poiché [^.]+ è più permissivo di quanto strettamente necessario).
Tutto sommato penso che in questo caso non sarebbe necessario.
MODIFICARE:Sadie ha individuato un difetto nella regex, ne ha cambiato la prima parte da [^.] a [^.]+
Altri suggerimenti
Ho ottenuto più controllo usando urlrewriter.net, qualcosa di simile a:
<unless header="Host" match="^www\.">
<if url="^(https?://)[^/]*(.*)$">
<redirect to="$1www.domain.tld$2"/>
</if>
<redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>
Zigdon ha l'idea giusta, tranne che la sua espressione regolare non è del tutto corretta.Utilizzo
^example\.com$
invece del suo suggerimento di:
^example\.com(.*)
Altrimenti non abbinerai solo example.com, abbinerai cose come example.comcast.net, example.com.au, ecc.
@Vinko
Per il tuo approccio generico, non sono sicuro del motivo per cui hai scelto di limitare la lunghezza del TLD nella tua espressione regolare?Non è molto a prova di futuro e non sono sicuro di quali vantaggi offra?In realtà non è nemmeno "a prova di adesso" perché esiste almeno un TLD di 6 caratteri là fuori (.museum) che non verrà abbinato.
Mi sembra inutile farlo.Non potresti semplicemente farlo ^[^.]+\.[^.]\+$
?(Nota:il punto interrogativo fa parte della frase, non la regex!)
A parte questo, c’è un problema più grande con questo approccio che è:fallirà per i domini che non sono direttamente sotto il TLD.Si tratta di domini in Australia, Regno Unito, Giappone e molti altri paesi, che hanno gerarchie:.co.jp, .co.uk, .com.au e così via.
Che ciò costituisca o meno una preoccupazione per l'OP, non lo so, ma è qualcosa di cui essere consapevoli se stai cercando una risposta "risolvi tutto".
L'OP non ha ancora chiarito se desidera una soluzione generica o una soluzione per un singolo (o un piccolo gruppo) di domini noti.Se è quest'ultimo, vedi la mia altra nota sull'utilizzo dell'approccio di Zigdon.Se è il primo caso, procedi con l'approccio di Vinko tenendo conto delle informazioni contenute in questo post.
Modificare:Una cosa che ho tralasciato fino ad ora, che potrebbe essere o meno un'opzione per te dal punto di vista aziendale, è andare dall'altra parte.Tutti i nostri siti reindirizzano http://www.dominio.com A http://dominio.com.La gente di http://no-www.org difendi abbastanza bene (IMHO) il fatto che questo sia il modo "giusto" per farlo, ma è comunque solo una questione di preferenza.Una cosa è certa, però, è molto più semplice scrivere una regola generica per quel tipo di reindirizzamento rispetto a questa.
@org 0100h Sì, ci sono molte variabili escluse dalla descrizione del problema e tutti i tuoi punti sono validi e dovrebbero essere affrontati in caso di un'implementazione effettiva.Ci sono sia pro che contro nella regex proposta.Da un lato è più semplice e a prova di futuro, dall'altro vuoi davvero abbinare example.foobar se inviato nell'intestazione Host?Potrebbero esserci alcuni casi limite in cui finirai per reindirizzare al dominio sbagliato.Una terza alternativa è modificare la regex per utilizzare un elenco dei domini effettivi, se più di uno
RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]
(Nota per Chris, quello Volere modifica %1)
@chrisofspades Non è pensato per sostituirlo, la tua condizione numero due assicura che non abbia www, mentre la mia no.Non modificherà i valori di %1, %2, %3 perché non memorizza le corrispondenze (ovviamente, non utilizza parentesi).
Non puoi regolare RewriteCond per operare solo su example.com?
RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]
Perché non hai qualcosa di simile nel tuo file vhost (di httpd)?
ServerName: www.example.com
ServerAlias: example.com
Ovviamente questo non verrà reindirizzato, continuerà normalmente