Назад | Перейти на главную страницу

Порядок правил mod_rewrite в .htaccess не соблюдается

Мы пытаемся применить HTTPS к одним URL и HTTP к другим. Мы также переписываем URL-адреса, чтобы все запросы проходили через наш index.php. Вот наш файл .htaccess.

# enable mod_rewrite
RewriteEngine on

# define the base url for accessing this folder
RewriteBase /

# Enforce http and https for certain pages
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/(en|fr)/(customer|checkout)(.*)$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/(en|fr)/(customer|checkout)(.*)$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# rewrite all requests for file and folders that do not exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?query=$1 [L,QSA]

Если мы не включим последнее правило (RewriteRule ^ (. *) $ Index.php? Query = $ 1 [L, QSA]), правила HTTPS и HTTP работают отлично; Когда мы добавляем последние три строки, наши другие правила перестают работать должным образом.

Например, если мы попытаемся перейти на https: // www.domain.com/en/customer/login, он будет перенаправлен на http: // www.domain.com/index.php?query=en/customer/login.

Это похоже на то, что последнее правило применяется до того, как будет выполнено перенаправление, и после флага [L], указывающего, что перенаправление является последним применимым правилом.

ОБНОВИТЬ

Мы добавили флаги [NS] во все наши правила, но это не имело значения.

Ваши первые два правила выполняются в первый раз, а затем делают дополнительный запрос (из-за 301), который попадет в третье RewriteRule при повторном входе. Попробуйте вместо этого: Я добавил исключение для вашего пути "оформления заказа":

# enable mod_rewrite
RewriteEngine on

# define the base url for accessing this folder
RewriteBase /

# Enforce http and https for certain pages
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/(en|fr)/(customer|checkout)(.*)$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/(en|fr)/(customer|checkout)(.*)$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(en|fr)/(customer|checkout)(.*)$ [NC]
RewriteRule ^(.*)$ index.php?query=$1 [L,QSA]

Надеюсь, это поможет!

Какого поведения вы ожидаете?

https://site.com/en/customer/login не будут затронуты первое или второе правило в вашем .htaccess, и поскольку / en / customer / login не является файлом или каталогом в вашей системе, он будет перезаписан.

http://site.com/en/customer/login будет затронуто вашим первым правилом и будет перенаправлен на https://site.com/en/customer/login. Поскольку он был перенаправлен, теперь это новый ответ, на него не повлияет первое или второе правило в вашем .htaccess, и он будет соответствовать последнему тесту (/ en / customer / login не существует как файл или каталог) и его перепишут.

http://site.com/en/somethingelse не будут затронуты вашим первым или вторым правилом, и, поскольку / en / somethingelse не существует, он перепишет URL-адрес.

https://site.com/en/somethingelse не будет затронуто первое правило, будет перенаправлен на http://site.com/en/somethingelse. Поскольку он был перенаправлен, это новый ответ, на него не повлияет первое или второе правило в вашем .htaccess, и он будет соответствовать последнему тесту (/ en / somethingelse не существует как файл или каталог), и он будет переписать.