Preusmjeravanje HTTP-a na HTTPS: Prepisivanje URL-a u IIS 8 Windows Server 2012 Dio 5: SSL certifikat

Pokušavam promijeniti DocumentRoot u subfolder putem .htaccess.

Ovo dobro radi ...

RewriteCond %{REQUEST_URI} !subfolder/ RewriteRule ^(.*)$ /subfolder/$1 

... međutim, to želim učiniti samo kada je određeni parametar upita (var=test) je postavljeno, pa imam ovo:

RewriteCond %{QUERY_STRING} ^var=test$ RewriteCond %{REQUEST_URI} !subfolder/ RewriteRule ^(.*)$ /subfolder/$1 

... ali iz nekog razloga ovo ne uspijeva.

Ima li prijedloga u vezi s problemom?


UPDATE: Evo cjelovitog (pojednostavljenog) primjera:

.htaccess

RewriteEngine on RewriteCond %{QUERY_STRING} (.*(?:^|&))var=test((?:&|$).*) RewriteCond %{REQUEST_URI} !sites/test/ RewriteRule ^(.*)$ /sites/test/$1 

web stranice / test / index.php

<!DOCTYPE html> <html> <head> <title>Test</title> <link rel='stylesheet' type='text/css' href='styles.css'> </head> <body> 

Test

</body> </html>

web stranice / test / stilovi.css

* { color: red; } 

Pokušajte stranicu učitati s http://example.com/?var=test. The Test tekst bi trebao biti crven, ali nije.

Uklonite QUERY_STRING RewriteCond linija, i to djeluje.

Ali moram nekako moći provjeriti niz upita ..

Apache virtualni domaćin (u slučaju da je potrebno)

 ServerName www.example.com ServerAdmin [email protected] DocumentRoot '/var/www/mainsite'  Options FollowSymLinks AllowOverride None   Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all   

  • 2 je var=test jedini parametar? Bolje pravilo bi bilo RewriteCond %{QUERY_STRING} (.*(?:^|&))var=test((?:&|$).*) ako nije. Pogledajte: wiki.apache.org/httpd/RewriteQueryString
  • Da, točno, var = test je jedini parametar. Veliko hvala za bolji RewriteCond. Iz nekog razloga, drugi blok koda gore razbija putove CSS datoteke i ne mogu shvatiti zašto ...
  • 1 Navedite primjer cjelovitog URL-a koji tražite. Imajte na umu i da je vaš stanje provjerava "podmapu /" bilo gdje u URL-u zahtjeva trebali biste biti precizniji. Ako se odlučite za pristup "može se pojaviti bilo gdje u nizu upita", koji sugerira @Stephen, to se može pojednostaviti na RewriteCond %{QUERY_STRING} (?:^|&)var=test(?:&|$)
  • Puno hvala. Gore sam ažurirao svoje pitanje pojednostavljenim primjerom.

Iz nekog razloga, drugi blok koda gore razbija putove CSS datoteke i ne mogu shvatiti zašto ...

Jedina razlika s drugim blokom koda je što se zahtjev za vaše CSS datoteke neće ponovo napisati. Dok će to biti za prvi blok koda. Vaš CSS URL ne sadrži var=test Parametar URL-a. Prepisuje se samo URL glavne stranice koji sadrži parametar URL-a.

Dakle, dobio sam zahtjev za http://example.com/?var=test zatim /styles.css bit će zatraženo (a ne prepisano), umjesto /sites/test/styles.css, što bi izgleda bilo namjera.


AŽURIRANJE # 1: Kao što je spomenuto u komentarima, vjerojatno ne bi bilo praktično pokušati to riješiti .htaccess. Zahtjev za CSS datotekom potpuno je zaseban zahtjev. Ovdje ne postoji koncept "sesije" (ili bolje reći "zahtjeva za stranicu"). Morali biste posegnuti za kolačićima da biste održali stanje - što dodaje složenost (za ostale zahtjeve mora biti poništeno) i možda neće biti pouzdano. Ako želite ostati pri nizu upita okidač onda biste ovo mogli riješiti u PHP-u provjerom postojanja datoteke var=test upit upita i ručno dodajući ovo CSS URL-u u vašem HTML-u. (Ili čak, dodavanje ispravne (pune) URL-staze CSS URL-u u svoj HTML - iako možda pokušavate sakriti pravi put URL-a od svojih korisnika, pa to možda nije poželjno.)

Na primjer:

<?php $resourceQueryString = ''; if (isset($_GET['var']) && ($_GET['var'] == 'test')) { $resourceQueryString = '?var=test'; } <!DOCTYPE html> <html> <head> <title>Test</title> <link rel='stylesheet' type='text/css' href='styles.css<?=$resourceQueryString?>'> </head> <body> 

Test

</body> </html> ?> var13 ->

Ovo prirodno provjerava var=test bilo gdje u nizu upita, ne doslovno samo ?var=test.

Međutim, ako imate stotine statičnih stranica, to možda neće biti i praktično.


UPDATE # 2: Ako ste ipak htjeli isprobati pristup "kolačića" .htaccess, tada biste mogli učiniti nešto poput sljedećeg (neprovjereno):

RewriteEngine on # If query string passed then set a (session) cookie... RewriteCond %{QUERY_STRING} (?:^|&)var=test(?:&|$) RewriteRule ^ - [CO=rewrite_trigger:1:.example.com] # If no query string and a '.php' request then unset cookie RewriteCond %{QUERY_STRING} !var=test RewriteRule \.php$ - [CO=rewrite_trigger:0:.example.com:-1] # Rewrite request if query string OR cookie is set RewriteCond %{QUERY_STRING} (?:^|&)var=test(?:&|$) [OR] RewriteCond %{HTTP_COOKIE} rewrite_trigger=1 RewriteCond %{REQUEST_URI} !^/sites/test/ RewriteRule (.*) /sites/test/$1 [L] 

Promijeniti .example.com kako bi odgovarao vašoj domeni.

Imajte na umu da kolačić nije čitljiv na zahtjev da je kolačić zapravo postavljen. Kolačić se može čitati samo na sljedećim zahtjevima, pa stoga treba provjeriti bilo niz upita ILI kolačić.

Imajte na umu da ovo trenutno nije testirano (možete ga testirati kasnije ako budem imao vremena). Zapravo, razmišljajući o tome, možda postoji problem s prvim .php zahtjev bez niz upita nakon a .php zahtjev s niz upita (jer će kolačić i dalje biti postavljen). Možda će trebati varijabla okoline riješiti ovo? Ili možda provjerite (upit upita AND .php) ILI (kolačić I br .php) kako biste prepisali?

  • Aa, to je točno - veliko hvala što ste to tako dobro objasnili.
  • Postoji li način da se htaccessu kaže "ako 'glavni zahtjev' sadrži 'var = test' -i- ovo je zahtjev za CSS datoteku, a zatim prepišite URL"?
  • Ili točnije, "ako početni zahtjev sadrži" var = test ", onda bi svi sljedeći zahtjevi u ovoj sesiji trebali biti prepisani"?
  • 1 Vjerojatno ne bi bilo praktično pokušati to učiniti s .htaccess. Zahtjev za CSS datotekom potpuno je zaseban zahtjev. Ovdje ne postoji koncept "sesije" (ili bolje reći "zahtjeva za stranicu"). Morali biste posegnuti za kolačićima da biste održali stanje - što dodaje složenost i možda nije pouzdano. Ako želite ostati pri nizu upita okidač onda biste ovo mogli riješiti u PHP-u provjerom postojanja datoteke var=test upit upita i ručno dodajući ovo CSS URL-u u vašem HTML-u. Ažurirat ću svoj odgovor.
  • 1 Nema na čemu. Dodao sam nekoliko primjera koda za "pristup kolačićima" - iako je to trenutno neprovjereno i možda će trebati malo posla za otklanjanje pogrešaka (kao što je spomenuto u mom odgovoru)? Međutim, dodao bih da se upotreba kolačića za to "osjeća" pogrešno. Funkcionirao bi samo u razvojnom / testnom okruženju (što pretpostavljam da radite) - budući da botovi uglavnom ne postavljaju kolačiće, pa ne bi mogli ispravno prikazati vašu web stranicu.

radio za vas: Charles Robertson | Želite nas kontaktirati?