2008-09-08 8 views
6

Ich verwende Helicon's ISAPI Rewrite 3, die im Grunde aktiviert. Htaccess in IIS. Ich muss eine nicht www-URL zur www-Version umleiten, d. H. Example.com sollte zu www.example.com umleiten. Früher habe ich die folgende Regel aus den Beispielen, aber es wirkt Subdomains:Umleiten von nicht www URL zu www mit .htaccess

RewriteCond %{HTTPS} (on)? 
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC] 
RewriteCond %{REQUEST_URI} (.+) 
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L] 

Dies ist für die meisten Teile funktioniert, ist aber auch umleiten sub.example.com zu www.sub.example.com. Wie kann ich die obige Regel so umschreiben, dass Subdomains nicht umgeleitet werden?

Antwort

3

die folgende RewriteCond anhängen:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC] 

diese Weise ist es nur die Regel nondottedsomething.uptofiveletters anwenden werde, wie Sie sehen können, subdomain.domain.com die Bedingung nicht überein und wird somit nicht umgeschrieben werden.

Sie können [a-z] {2,5} für eine strengere tld-passende Regex ändern, sowie alle Einschränkungen für erlaubte Zeichen in Domain-Namen platzieren (da [^.] + Toleranter ist als unbedingt notwendig).

Alles in allem denke ich, dass in diesem Fall das nicht notwendig wäre.

EDIT: sadie entdeckte einen Fehler auf dem regulären Ausdruck, änderte den ersten Teil davon aus [^.] Bis [^.] +

+0

sagst du, ich sollte Zeile 2 durch deine Bedingung ersetzen, oder deine Bedingung in einer neuen Zeile hinzufügen? Wird das Hinzufügen in einer neuen Zeile die RewriteRule mit% 1,% 2 und% 3 beeinflussen? – chrisofspades

0

Können Sie den RewriteCond nicht so einstellen, dass er nur auf example.com läuft?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC] 
+0

sollte es stattdessen^Beispiel \ .com $ sein. Auf jeden Fall habe ich den Eindruck, dass Chris eine generische Lösung, nicht eine für eine einzelne Domain, möchte. –

1

ich mehr Kontrolle bekommen haben urlrewriter.net verwenden, so etwas wie:

<unless header="Host" match="^www\."> 
    <if url="^(https?://)[^/]*(.*)$"> 
    <redirect to="$1www.domain.tld$2"/> 
    </if> 
    <redirect url="^(.*)$" to="http://www.domain.tld$1"/> 
</unless> 
0

Warum haben Sie gerade so etwas in Ihrer vhost (von httpd) Datei?

ServerName: www.example.com 
ServerAlias: example.com 

Natürlich, das wird nicht-direct wieder, das als normal

1

Zigdon nur weitermachen wird hat die richtige Idee, außer seine regex nicht ganz richtig ist. Verwenden

^example\.com$

statt seinen Vorschlag von:

^example\.com(.*)

Andernfalls werden Sie nicht nur example.com werden passende, werden Sie Dinge wie example.comcast.net werden passende, example.com.au usw.

1

@Vinko

Für Ihre generischen Ansatz, ich bin nicht sicher, wh y Sie haben die Länge der TLD in Ihrer Regex begrenzt? Es ist nicht sehr zukunftssicher und ich bin nicht sicher, welchen Nutzen es bietet? Es ist eigentlich nicht einmal "jetzt-Beweis", weil es dort mindestens eine 6-stellige TLD (.museum) gibt, die nicht zusammenpassen wird.

Es scheint mir unnötig, dies zu tun. Könnten Sie nicht einfach ^[^.]+\.[^.]\+$ tun? (Hinweis: Das Fragezeichen ist Teil des Satzes, nicht die Regex!)

Abgesehen davon gibt es ein größeres Problem mit diesem Ansatz: Es wird für Domänen fehlschlagen, die nicht direkt unterhalb der TLD sind. Dies sind Domains in Australien, Großbritannien, Japan und vielen anderen Ländern, die Hierarchien haben: .co.jp, .co.uk, .com.au und so weiter.

Ob das OP etwas angeht oder nicht, weiß ich nicht, aber es ist etwas zu beachten, wenn Sie nach einer "fix all" Antwort sind.

Das OP hat noch nicht klargestellt, ob er eine generische Lösung oder eine Lösung für eine einzelne (oder kleine Gruppe) bekannter Domänen haben möchte. Wenn es Letzteres ist, siehe meine andere Notiz über die Verwendung von Zigdon Ansatz. Wenn es ersteres ist, dann fahren Sie mit Vinkos Ansatz fort und berücksichtigen dabei die Informationen in diesem Beitrag.

Edit: Eine Sache, die ich bis jetzt ausgelassen habe, die für Sie geschäftlich eine Option sein kann oder nicht, ist, in die andere Richtung zu gehen. Alle unsere Seiten leiten http://www.domain.com zu http://domain.com um. Die Leute bei http://no-www.org machen einen ziemlich guten Fall (IMHO) für dies die "richtige" Art, es zu tun, aber es ist immer noch nur eine Frage der Präferenz. Eine Sache ist jedoch sicher, es ist viel einfacher, eine generische Regel für diese Umleitung zu schreiben als diese.

1

@org 0100h Ja, es sind viele Variablen in der Beschreibung des Problems und alle Ihre Punkte sind gültig und sollten im Falle einer tatsächlichen Implementierung behandelt werden. Es gibt sowohl Vor- als auch Nachteile für Ihre vorgeschlagene Regex. Auf der einen Seite ist es einfacher und zukunftssicher, auf der anderen Seite wollen Sie example.foobar wirklich anpassen, wenn es im Host-Header gesendet wird? Es kann einige Randfälle geben, wenn Sie am Ende auf die falsche Domain umleiten. Eine thrid Alternative ist Modifizieren der regex eine Liste der tatsächlichen Domains zu verwenden, wenn mehr als ein, wie

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC] 

(Chris Hinweis, dass man wird Veränderung in% 1)

@chrisofspades Es ist nicht gedacht, um es zu ersetzen, Ihre Bedingung Nummer zwei stellt sicher, dass es nicht www hat, während meins nicht. Die Werte von% 1,% 2,% 3 werden nicht geändert, da die Treffer nicht gespeichert werden (es werden keine Klammern verwendet).