https в htaccess и порядок правил (используя Expression Engine) - PullRequest
2 голосов
/ 06 января 2012

Я строю сайт в движке выражений, частью которого должен быть https. Сайт также использует новое доменное имя (новое www.example-new.com старое www.example.old.com).

Я хочу сделать следующие вещи:

  1. удалить index.php
  2. сила www
  3. принудительное использование https для любого URL-адреса, начинающегося www.example.old.com/extranet
  4. перенаправить URL-адреса https, которые не являются www.example.old.com/extranet (например, www.example.old.com/news, на http

У меня есть следующий код, который работает для первых двух требований:

    <IfModule mod_rewrite.c>
RewriteEngine On
# Force www
RewriteCond %{HTTP_HOST} ^example-new.com$ [NC]
RewriteRule ^(.*)$ http://www.example-new.com/$1 [R=301,L] 

# Removes index.php
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

</IfModule>
AddType x-httpd-php53 .php

Кажется, я ходил кругами, поэтому у меня есть два вопроса, которые помогут мне написать другие переписки (хотя не стесняйтесь делиться предложениями ...):

1) Должен ли код для требований 3 и 4 располагаться перед кодом «removes index.php»?

2) Имеет ли позиция какое-либо отношение к перенаправлениям, которые будут поступать со старого сайта, например www.example-old.com/some-link-here.asp будет перенаправлен на www.example-new.com/some-new-link-here

Спасибо

Грегор

Ответы [ 4 ]

3 голосов
/ 06 января 2012

1) Удалить файл index.php из URL-адресов ExpressionEngine

RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

2) Добавить 'www' ко всем URI

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

3) Принудительно https: // для любого URI, начинающегося с / extranet

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/extranet(.*)$ [NC]
RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}$1 [R=301,L]

4) Перенаправить https: // URI, которые не являются / extranet

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/extranet(.*)$ [NC]
RewriteRule . http://%{HTTP_HOST}%{REQUEST_URI}$1 [R=301,L]

Собрав все воедино, вот ваш полный набор RewriteRules:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine on

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

    RewriteCond %{HTTPS} off
    RewriteCond %{REQUEST_URI} ^/extranet(.*)$ [NC]
    RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}$1 [R=301,L]

    RewriteCond %{HTTPS} on
    RewriteCond %{REQUEST_URI} !^/extranet(.*)$ [NC]
    RewriteRule . http://%{HTTP_HOST}%{REQUEST_URI}$1 [R=301,L]

    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
0 голосов
/ 11 января 2012

Если это поможет ... Я только вчера сделал это для сайта электронной коммерции ... Вот мой файл .htaccess

# Remove WWW from URL
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

# Add a trailing slash to paths without an extension
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteCond %{REQUEST_METHOD} !=POST
RewriteRule ^(.*)$ $1/ [L,R=301]

#remove index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1

#Force HTTPS on checkout/account pages
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} (checkout|account)
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

#remove HTTPS on all other pages
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(img|_|images|checkout|account)
RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
0 голосов
/ 08 января 2012
# force www on hostname, but keep same protocol (http/https)
RewriteCond %{HTTP_HOST} !^www\.(.+)
RewriteCond %{HTTPS}s ^(on(s)|offs)
RewriteRule ^ http%2://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
0 голосов
/ 06 января 2012

1) Должен ли код для требований 3 и 4 располагаться перед кодом «removes index.php»?

Правила обрабатываются в том порядке, в котором вы их пишете.Я ожидаю, что вы хотите, чтобы сайт сначала перенаправлял, а затем выполнял удаление индекса, поэтому да, он должен идти до

2) Имеет ли позиция какое-либо отношение к перенаправлениям, которые будут поступать из старогонапример, www.example-old.com/some-link-here.asp будет перенаправлен на www.example-new.com/some-new-link-here

Если вы используетеодин и тот же каталог для обоих сайтов, тогда вам нужно будет добавить все правила для одного сайта с помощью RewriteCond, ограничивающего домен.В противном случае порядок правил (старый или новый сайт) важен.

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

Ниже приведен код для принудительного использования http /с

#if not secure
RewriteCond %{HTTPS} off 
#and starts with /extranet
RewriteCond %{REQUEST_URI} ^/extranet [NC]
#redirect to secure
RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#if  secure
RewriteCond %{HTTPS} on
#and does not start with /extranet
RewriteCond %{REQUEST_URI} !^/extranet [NC]
#redirect to http
RewriteRule . http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
...