Пренасочване от HTTP към HTTPS: Пренаписване на URL в IIS 8 Windows Server 2012 Част 5: SSL сертификат

Опитвам се да сменя DocumentRoot на subfolder чрез .htaccess.

Това работи добре ...

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

... обаче искам да направя това само когато определен параметър на заявката (var=test) е зададено, така че имам това:

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

... но по някаква причина това не работи.

Някакви предложения какъв може да е проблемът?


АКТУАЛИЗАЦИЯ: Ето пълен (опростен) пример:

.htaccess

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

sites / test / index.php

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

Test

</body> </html>

сайтове / тест / стилове.css

* { color: red; } 

Сега опитайте да заредите страницата с http://example.com/?var=test. The Test текстът трябва да е червен, но не е.

Премахни QUERY_STRING RewriteCond линия и работи.

Но трябва да мога по някакъв начин да проверя за низа на заявката ..

Виртуален хост на Apache (в случай, че е необходимо)

 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 е var=test единственият параметър? По-добро правило би било RewriteCond %{QUERY_STRING} (.*(?:^|&))var=test((?:&|$).*) ако не е. Вижте: wiki.apache.org/httpd/RewriteQueryString
  • Да, така е, var = test е единственият параметър. Много благодаря за по-доброто RewriteCond. По някаква причина вторият кодов блок по-горе прекъсва CSS файловите пътища и не мога да разбера защо ...
  • 1 Моля, включете пример за пълния URL адрес, който искате. Имайте предвид също, че вашият състояние проверява за "подпапка /" навсякъде в URL адреса на заявката трябва да сте по-конкретни. Ако се стремите към подхода "може да се появи навсякъде в низа на заявката", който @Stephen предлага, тогава това може да бъде опростено до RewriteCond %{QUERY_STRING} (?:^|&)var=test(?:&|$)
  • Много благодаря. Актуализирах въпроса си по-горе с опростен пример.

По някаква причина вторият кодов блок по-горе прекъсва CSS файловите пътища и не мога да разбера защо ...

Единствената разлика с втория кодов блок е, че заявката за вашия CSS файл (и) няма да бъде пренаписана. Докато това ще бъде за първия кодов блок. Вашият CSS URL не съдържа var=test URL параметър. Пренаписва се само URL адресът на основната страница, който съдържа параметъра URL.

И така, дадена молба за http://example.com/?var=test тогава /styles.css ще бъде поискано (а не пренаписано), вместо /sites/test/styles.css, което изглежда е намерението.


АКТУАЛИЗАЦИЯ # 1: Както бе споменато в коментарите, вероятно не би било практично да се опитате да разрешите това с .htaccess. Искането за CSS файла е напълно отделна заявка. Тук няма понятие за „сесия“ (или по-скоро „заявка за страница“). Ще трябва да прибягвате до бисквитки, за да поддържате състояние - което добавя сложност (би трябвало да бъде деактивирано за други заявки) и може да не е надеждно. Ако искате да останете с низа на заявката спусък тогава можете да разрешите това в PHP, като проверите за var=test низ за заявка и ръчно добавяне на това към CSS URL във вашия HTML. (Или дори, добавяне на правилния (пълен) URL-път към CSS URL адреса във вашия HTML - въпреки че може би се опитвате да скриете реалния URL път от вашите потребители, така че това може да не е желателно.)

Например:

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

Тест

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

Това естествено проверява за var=test навсякъде в низа на заявката, а не буквално само ?var=test.

Ако обаче имате 100s статични страници, това също може да не е практично.


АКТУАЛИЗАЦИЯ №2: Ако все пак искате да изпробвате подхода "бисквитки" .htaccess, тогава може би бихте могли да направите нещо като следното (непроверено):

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] 

Промяна .example.com за да съответства на вашия домейн.

Имайте предвид, че бисквитката не се чете при заявката, в която бисквитката действително е настроена. „Бисквитката“ може да се чете само при последващи заявки, поради което е необходимо да се провери или низът за заявка ИЛИ „бисквитката“.

Обърнете внимание, че в момента това не е тествано (може да го тествате по-късно, ако имам време). Всъщност, като се замисля, може да има проблем с първата .php заявка без низът на заявката след .php заявка с низът на заявката (тъй като бисквитката все още ще бъде настроена). Може да се нуждае от променлива на средата за да разрешите това? Или може би проверете за (низ за заявка И .php) ИЛИ (бисквитка И не .php), за да пренапишете?

  • Ааа, точно така - много благодаря, че го обясни толкова добре.
  • Има ли някакъв начин да се каже на htaccess "ако 'основната заявка' съдържа 'var = test' -и- това е заявка за CSS файл, след това пренапишете URL адреса?"
  • Или по-скоро „ако първоначалната заявка съдържа„ var = test “, тогава всички следващи заявки в тази сесия трябва да бъдат пренаписани“?
  • 1 Вероятно не би било практично да се опитате да направите това с .htaccess. Искането за CSS файла е напълно отделна заявка. Тук няма понятие за „сесия“ (или по-скоро „заявка за страница“). Ще трябва да прибягвате до бисквитки, за да поддържате състояние - което добавя сложност и може да не е надеждно. Ако искате да останете с низа на заявката спусък тогава можете да разрешите това в PHP, като проверите за var=test заявка низ и ръчно добавяне на това към CSS URL във вашия HTML. Ще актуализирам отговора си.
  • 1 Вие сте добре дошли. Добавих някакъв примерен код за „подхода на бисквитките“ - въпреки че в момента това не е тествано и може да се наложи някаква работа за отстраняване на грешки (както е споменато в моя отговор)? Бих добавил обаче, че използването на бисквитки за това „се чувства“ погрешно. Той би работил само в среда за разработка / тестване (което предполагам е това, което правите) - тъй като ботовете обикновено не задават бисквитки, така че не биха могли да направят паяк / визуализиране на вашия сайт правилно.

е работил за вас: Charles Robertson | Искате ли да се свържете с нас?