htaccess для перенаправления на SSL - PullRequest
0 голосов
/ 17 ноября 2011

В течение последних нескольких часов (дней) у меня возникали проблемы с перенаправлением страницы в SSL.

Моя настройка следующая: у меня есть следующий .htaccess для сайта электронной коммерции на Apache 2.2.16 в Debian (все необходимые моды включены)

RewriteEngine On
RewriteBase /shop
RewriteCond $1 !^(index\.php|products|img|theme\.php|checkout\.php)
RewriteRule ^(.*)$ index.php?/$1 [L]

все запросы передаются в index.php, который действует как мой контроллер и включает в себя другие файлы .php при необходимости.

Теперь я хочуиспользовать HTTPS для процесса оформления заказа, который представляет собой php-скрипт, хитро называемый checkout.php

. Я подумал, что это будет так же просто, как изменить мой .htaccess на:

RewriteEngine On
RewriteBase /shop
RewriteCond  %{SERVER_PORT} !^443$
RewriteCond %{SERVER_URI} checkout\.php
RewriteRule ^checkout.php?/$1 https://localhost/shop/checkout.php?/$1 [L,R]
RewriteCond $1 !^(index\.php|products|img|theme\.php|checkout\.php)
RewriteRule ^(.*)$ index.php?/$1 [L]

так, чтобы оформить заказ.php не обрабатывается index.php.Видимо, не все так просто.Я мог бы сделать это, используя жестко запрограммированную ссылку https для оформления заказа, но я бы предпочел сделать это с помощью mod_rewrite.Если кто-то сможет поделиться с вами некоторыми соображениями, это будет очень полезно.

Заранее спасибо

1 Ответ

0 голосов
/ 17 ноября 2011

Есть несколько проблем.Во-первых, шаблон в вашем первом RewriteRule

RewriteRule ^checkout.php?/$1   https://localhost/shop/checkout.php?/$1 [L,R]

написан неправильно.$1 там не имеет смысла (это результат захвата, но захват еще не произошел), а также строка запроса (часть запроса после ?) не является частью того, что совпадает, как Документация RewriteRule говорит.

Во-вторых, я думаю, что вы хотели использовать REQUEST_URI вместо SERVER_URI.

Так что я думаю, вы хотите что-то вроде этого:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/checkout\.php
RewriteRule .* https://localhost/shop/checkout.php [L,R]

RewriteCond %{REQUEST_URI} !^/(index\.php|products|img|theme\.php|checkout\.php)
RewriteRule ^(.*)$ /index.php?/$1 [L]

Несколько замечаний:

  • Вам не нужно сопоставлять или добавлять обратно в строку запроса в первом RewriteRule;mod_rewrite автоматически добавит его обратно.
  • Обычно тестируют RewriteCond %{HTTPS} off вместо RewriteCond %{SERVER_PORT} !443, как предлагает @Jon Lin.
  • Возможно, вы захотите добавить флаг QSA в вашем втором RewriteRule.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...