https in htaccess和规则顺序(使用Expression Engine)

时间:2012-01-06 17:57:32

标签: .htaccess mod-rewrite https expressionengine

我在表达引擎中构建一个网站,其中一部分需要是https。该网站还使用了一个新的域名(新的域名www.example-new.com旧的www.example.old.com)。

我想做以下事情:

  1. 删除index.php
  2. 强制www
  3. 强制https为任何网址开始www.example.old.com/extranet
  4. 重定向https不是www.example.old.com/extranet的网址(例如www.example.old.com/news到http
  5. 到目前为止,我有以下代码适用于前两个要求:

        <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的代码是否应该在“删除index.php”代码之前定位?

    2)该位置是否与来自旧网站的重定向有关,例如www.example-old.com/some-link-here.asp将重定向至www.example-new.com/some-new-link-here

    谢谢,

    格里

4 个答案:

答案 0 :(得分:3)

1)从ExpressionEngine URLs

中删除'index.php'
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://用于以/ extranet

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

4)重定向https://不是/ extranet的URI

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>

答案 1 :(得分:0)

  

1)要求3和4的代码是否应该在“删除index.php”代码之前定位?

规则按您编写的顺序处理。我希望您希望网站首先重定向然后执行删除索引,所以是的,它应该在

之前
  

2)该位置是否与来自旧网站的重定向有关,例如www.example-old.com/some-link-here.asp将重定向至www.example-new.com/some-new-link-here

如果您对两个站点使用相同的目录,那么您需要为一个站点的所有规则添加一个限制域的RewriteCond。否则,规则的顺序(旧网站与新网站)很重要。

您从旧网站重定向还应包含新网站中的规则。确保您在必要时使用http / s以避免额外的重定向。

以下是强制http / s

的代码
#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]

答案 2 :(得分:0)

# 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]

答案 3 :(得分:0)

如果有帮助......我昨天刚刚为电子商务网站做了这个...这是我的.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]