Vra

Ek gebruik Helicon se ISAPI Herskryf 3 , wat basies in staat stel om htaccess in IIS. Ek nodig het om 'n nie-www URL lei na die www weergawe, dit wil sê example.com moet lei na www.example.com. Ek gebruik die volgende reël uit die voorbeelde, maar dit raak subdomeinen:

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

Dit werk vir grootste deel, maar is ook sub.example.com lei tot www.sub.example.com. Hoe kan ek herskryf bogenoemde reël sodat subdomeinen moenie getrek?

Was dit nuttig?

Oplossing

Voeg die volgende RewriteCond:

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

Op dié manier sal dit net die reël van toepassing op nondottedsomething.uptofiveletters soos jy kan sien, subdomain.domain.com sal nie ooreen met die toestand en dus sal nie herskryf word.

Jy kan verander [az] {2,5} vir 'n strenger tld bypassende regex, sowel as die plasing van al die beperkinge vir toegelaat karakters in domein name (soos [^.] + Is meer permissief as streng noodsaaklik).

Alles in ag genome Ek dink in hierdie geval dat nie nodig sou wees.

EDIT: Sadie raakgesien 'n fout op die regex, verander die eerste deel van dit uit [. ^] Om [. ^] +

Ander wenke

Ek het gekry meer beheer met behulp van urlrewriter.net , iets soos:

<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 het die regte idee, behalwe sy regex is nie heeltemal reg. Gebruik

^example\.com$

in plaas van sy voorstel van:

^example\.com(.*)

Anders sal jy nie net word wat ooreenstem met example.com, jy sal ooreenstem met dinge soos example.comcast.net, example.com.au, ens.

@Vinko

Vir jou generiese benadering, Ek is nie seker hoekom jy gekies het om die lengte van die TLD in jou regex beperk? Dit is nie baie toekoms-proof, en ek is nie seker wat baat dit die verskaffing van? Dit is eintlik nie eens "nou-proof", want daar is ten minste een 6-karakter TLD daar buite (museum) wat nie sal ooreenstem.

Dit lyk onnodig om my om dit te doen. Kon jy nie net weet ^[^.]+\.[^.]\+$? (Let op: die vraagteken is deel van die sin, nie die regex)

Al wat ter syde stel, daar is 'n groter probleem met hierdie benadering wat: dit sal smag na gebiede wat nie direk onder die TLD. Dit is gebiede in Australië, die Verenigde Koninkryk, Japan, en baie ander lande, wat hiërargieë het:. .Co.jp, Co.uk., .com.au, en so aan

Of dat 'n saak van kommer vir die OP, weet ek nie, maar dit is iets om bewus te wees van as jy na 'n "fix al" antwoord.

Die OP het nog nie het dit duidelik gemaak of hy wil 'n generiese oplossing of 'n oplossing vir 'n enkele (of klein groepie) van bekende gebiede. As dit die laasgenoemde, sien my ander opmerking oor die gebruik van Zigdon se benadering. As dit is die voormalige, dan voort te gaan met Vinko se benadering met inagneming van die inligting in hierdie boodskap.

Edit: Een ding wat ek uitgelaat tot nou toe, wat mag of nie mag 'n opsie vir jou besigheid-wyse, is om na die ander kant gaan wees nie. Al ons webwerwe lei http://www.domain.com om http://domain.com . Die mense by http://no-www.org maak 'n goeie saak (IMHO) vir hierdie synde die "regte" manier om dit te doen, maar dit is nog steeds seker net 'n kwessie van voorkeur. Een ding is seker al is, dit is baie makliker om 'n generiese reël vir daardie soort van verwysing as hierdie een te skryf.

@org 0100h Ja, daar is baie veranderlikes uitgelaat van die beskrywing van die probleem, en al jou punte is geldig kinders en moet in die geval van 'n werklike implementering word. Daar is beide voor-en nadele aan jou voorgestel regex. Aan die een kant is dit makliker en toekoms bewys, aan die ander kant, dink jy regtig wil example.foobar pas as gestuur in die Host kop? Daar is dalk 'n paar rand gevalle wanneer jy uiteindelik redirecting aan die verkeerde domein. A Derde alternatief is die wysiging van die regex om 'n lys van die werklike domeine te gebruik, indien meer as een, soos

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

(Nota aan Chris, wat 'n mens sal verandering% 1)

@chrisofspades Dit is nie bedoel om dit te vervang, jou toestand nommer twee verseker dat dit nie www nie, terwyl myne nie doen. Dit sal nie die waardes van% 1,% 2,% 3 verander omdat dit nie die wedstryde (maw, beteken dit nie gebruik tussen hakies).

stoor

Kan jy nie aan te pas die RewriteCond om net te werk op example.com?

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

Hoekom jy hoef net iets soos hierdie te hê in jou vhost (van httpd) in te dien?

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

Natuurlik dat gewoond weer direkte, wat sal net voort soos normaal

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top