Frage

Ich benutze Helicons ISAPI Rewrite 3, was grundsätzlich .htaccess in IIS ermöglicht.Ich muss eine Nicht-WWW-URL auf die WWW-Version umleiten, d. h.example.com sollte auf www.example.com umleiten.Ich habe die folgende Regel aus den Beispielen verwendet, sie wirkt sich jedoch auf Subdomains aus:

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

Dies funktioniert größtenteils, führt aber auch zur Umleitung von sub.example.com zu www.sub.example.com.Wie kann ich die obige Regel umschreiben, damit Subdomains nicht umgeleitet werden?

War es hilfreich?

Lösung

Hängen Sie den folgenden RewriteCond an:

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

Auf diese Weise wird die Regel nur auf nondottedsomething.uptofünfletters angewendet. Wie Sie sehen, erfüllt subdomain.domain.com die Bedingung nicht und wird daher nicht neu geschrieben.

Sie können [a-z]{2,5} für einen strengeren tld-Matching-Regex ändern und alle Einschränkungen für zulässige Zeichen in Domänennamen festlegen (da [^.]+ freizügiger ist als unbedingt erforderlich).

Alles in allem denke ich, dass das in diesem Fall nicht nötig wäre.

BEARBEITEN:Sadie hat einen Fehler im regulären Ausdruck entdeckt und den ersten Teil davon von [^.] in [^.]+ geändert

Andere Tipps

Mit habe ich mehr Kontrolle bekommen urlrewriter.net, 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>

Zigdon hat die richtige Idee, nur dass sein regulärer Ausdruck nicht ganz stimmt.Verwenden

^example\.com$

statt seines Vorschlags:

^example\.com(.*)

Andernfalls stimmen Sie nicht nur mit example.com überein, sondern auch mit Dingen wie example.comcast.net, example.com.au usw.

@Vinko

Was Ihren generischen Ansatz betrifft, bin ich mir nicht sicher, warum Sie sich dafür entschieden haben, die Länge der TLD in Ihrer Regex zu begrenzen?Es ist nicht sehr zukunftssicher und ich bin mir nicht sicher, welchen Nutzen es bietet?Tatsächlich ist es nicht einmal „jetzt sicher“, da es mindestens eine 6-stellige TLD (.museum) gibt, die nicht übereinstimmt.

Es erscheint mir unnötig, dies zu tun.Könntest du das nicht einfach tun? ^[^.]+\.[^.]\+$?(Notiz:Das Fragezeichen ist Teil des Satzes, nicht der reguläre Ausdruck!)

Abgesehen davon gibt es bei diesem Ansatz ein größeres Problem:Bei Domains, die nicht direkt unter der TLD liegen, schlägt dies fehl.Dabei handelt es sich um 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 für den OP von Belang ist oder nicht, weiß ich nicht, aber es ist etwas, das Sie beachten sollten, wenn Sie nach einer „Alles reparieren“-Antwort suchen.

Der 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 möchte.Wenn es sich um Letzteres handelt, lesen Sie meinen anderen Hinweis zur Verwendung von Zigdons Ansatz.Wenn ersteres der Fall ist, fahren Sie mit Vinkos Ansatz fort und berücksichtigen Sie dabei die Informationen in diesem Beitrag.

Bearbeiten:Eine Sache, die ich bisher ausgelassen habe und die für Sie geschäftlich eine Option sein kann oder auch nicht, ist, den anderen Weg zu gehen.Alle unsere Websites leiten weiter http://www.domain.com Zu http://domain.com.Die Leute von http://no-www.org Ich behaupte (meiner Meinung nach) ziemlich gut, dass dies der „richtige“ Weg ist, aber es ist sicherlich immer noch eine Frage der Präferenz.Eines ist jedoch sicher: Es ist viel einfacher, eine generische Regel für diese Art der Umleitung zu schreiben als diese.

@org 0100h Ja, in der Beschreibung des Problems wurden viele Variablen ausgelassen, und alle Ihre Punkte sind gültig und sollten im Falle einer tatsächlichen Implementierung berücksichtigt werden.Ihr vorgeschlagener regulärer Ausdruck hat sowohl Vor- als auch Nachteile.Einerseits ist es einfacher und zukunftssicher, andererseits möchten Sie wirklich example.foobar abgleichen, wenn es im Host-Header gesendet wird?Es kann vorkommen, dass Sie in bestimmten Grenzfällen auf die falsche Domain umleiten.Eine dritte Alternative besteht darin, den regulären Ausdruck so zu ändern, dass er eine Liste der tatsächlichen Domänen verwendet, wenn es sich um mehr als eine handelt

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

(Anmerkung an Chris, das Wille ändern %1)

@chrisofspades Es ist nicht dazu gedacht, es zu ersetzen. Ihre Bedingung Nummer zwei stellt sicher, dass es kein www hat, während es bei mir nicht der Fall ist.Die Werte von %1, %2, %3 werden nicht geändert, da die Übereinstimmungen nicht gespeichert werden (also keine Klammern verwendet werden).

Können Sie RewriteCond nicht so anpassen, dass es nur auf example.com funktioniert?

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

Warum haben Sie nicht einfach so etwas in Ihrer vhost-Datei (von httpd)?

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

Natürlich wird das nicht umgeleitet, es läuft ganz normal weiter

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top