2015-01-26 2 views
1

Я переписал правило, чтобы перенаправить на www и переписать правила для перенаправления на ssl. Это моя желаемая установка и все работает отлично, за исключением, когда я добавить новое условие:Mod Переписать не перенаправлять, как ожидалось

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC] 

Если это условие истинно, я не хочу, чтобы редирект SSL произойти. Проблема, которую я вижу, заключается в том, что когда я это делаю, весь URL перенаправляется на https://www.example.com/index.php?query=string

Нормальное поведение даже для каждой другой страницы работает нормально. URI остается таким же, но выполняется index.php. Вот мой файл .htaccess ниже:

Options +FollowSymLinks -Indexes 

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC] 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php 

Мое ожидаемое поведение является кто-то типами в URL http://www.example.com/new-review?query=string и эта страница запускает код на index.php без переключения пользователей Uri к index.php. Я просто не могу понять, почему последнее правило перезаписи:

RewriteRule . index.php 

следует за ожидаемым поведением за все, кроме одного условия. Все, что я хочу, - это то, что эта страница работает как страница, отличная от ssl, но все еще выполняется через index.php.

+1

Прежде всего, вы переписывания не-WWW версия для HTTPS уже - в этом случае ваш RewriteCond для/у-обзор приходит слишком поздно уже. И RewriteCond влияет только на RewriteRule, который следует за ним, поэтому ваше последнее правило не зависит от проверки состояния для '! ^/New-review?. *' В вашей текущей настройке. – CBroe

+0

Но если предположить, что URL-адрес, который они вводят, это «http: // www example.com/new-review?query=string», тогда первое условие потерпит неудачу, и ничего не произойдет, второе условие должно потерпеть неудачу, и ничего не произойдет, а третье условие должно всегда происходить до тех пор, пока не будет обнаружен новый просмотр файла или каталога. Кажется, что последний RewriteRule для index.php отправляет внешнее перенаправление, а не только внутреннюю переписывание запроса. –

ответ

2

Важная Хитрость заключается в том, чтобы использовать переменный вместо THE_REQUEST от REQUEST_URI в вашем состоянии. THE_REQUEST переменная представляет собой исходный запрос, полученный Apache из вашего браузера, и он не перезаписывается после выполнения некоторых правил перезаписи.

Таким образом, вы можете использовать:

Options +FollowSymLinks -Indexes 
RewriteEngine On 

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{THE_REQUEST} !^\s/new-review [NC] 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php [L] 
+1

Принимая это как ответ, потому что он прост и не требует слишком большого изменения в текущем коде. Дать +1 к ответу jon, потому что он объясняет немного лучше, почему это происходит. Спасибо вам обоим! –

+0

Добро пожаловать, рад, что это помогло. – anubhava

1

Перезаписывающий двигатель будет зацикливаться до тех пор, пока URI не перестанет меняться. Что происходит, когда вы запрашиваете /new-review, это не соответствует ни одному из правил переадресации, тогда оно соответствует последнему правилу и применяется, поэтому /new-review переписан на /index.php. Теперь переработайте петли двигателя и новый URI. На этот раз ваше второе правило соответствует URI (/index.php) и, таким образом, перенаправляется. Если вы не хотите, чтобы index.php попадет, то вам нужно либо предотвратить все циклы, или добавить Проходной:

Options +FollowSymLinks -Indexes 

RewriteEngine On 

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule^- [L] 

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC] 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php 

или

Options +FollowSymLinks -Indexes 

RewriteEngine On 

RewriteRule ^(index\.php)?$ - [L] 

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC] 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php 
+0

Отличное объяснение, почему это происходит. Наверное, я не полностью понял этот процесс. Вы ответили очень полезно для меня в будущем. +1 –

Смежные вопросы