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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top