2

我已经阅读了很多关于 SO 的一般主题的问题,但似乎无法找到解决我问题的解决方案。

我们正在使用 ExpressionEngine 并且只需要在 https:// 后面有一个部分我们希望网站的其余部分将任何 https:// 请求重定向到 http://。

示例 #1: http: //test.com/facebook 301 重定向到https://test.com/facebook

示例 #2: https: //test.com/test_page/ 301 重定向到http://test.com/test_page/

注意: /facebook 不是服务器上的目录,它是 ExpressionEngine 内部的模板组

到目前为止,这是我的 .htacess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Force SSL on facebook pages
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} ^/facebook
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ https://%2/$1 [R=301,L,QSA]

# Remove SSL on other pages
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/facebook
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L,QSA]

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

# Magic ExpressionEngine rule to remove index.php requirement from URLs    
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

当前问题: 示例 #2 工作正常,并且带有 https:// 的 URL 正在删除 https://。

但是如果你去http://test.com/facebook ,它重定向到http://test.com/ index.php /facebook。即没有HTTPS 和index.php 的添加。

我们认为 .htaccess 文件运行了两次,第一次是命中第一个块并被重定向,但随后它被添加了“index.php”,并命中了第二个块,因此删除了 https:/ /。

任何帮助将不胜感激。

谢谢!

实时 HTTP 标头报告

http://test.com/facebook/register

GET /facebook/register HTTP/1.1

HTTP/1.1 301 Moved Permanently
Date: Thu, 20 Dec 2012 17:20:17 GMT
Server: Apache
Location: https://test.com/facebook/register

--------

http://test.com/index.php/facebook/register

GET /index.php/facebook/register HTTP/1.1

HTTP/1.1 200 OK
Date: Thu, 20 Dec 2012 17:20:17 GMT
Server: Apache
4

2 回答 2

2

所以facebook页面也是由EE创建的。现在它是有道理的。该 urlhttp://example.com/facebook被重定向到 https 版本。然后它被重写到 EE url /index.php/facebook,它不再匹配^/facebook,所以它再次被重定向到http://example.com/index.php/facebook

这可以例如通过使用以下方法来解决。

# Remove SSL on other pages
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/facebook
RewriteCond %{REQUEST_URI} !^/index\.php/facebook
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L,QSA]
于 2012-12-20T21:34:00.453 回答
0

这个条件没有像你期望的那样工作:

RewriteCond %{REQUEST_URI} !^/facebook

我相信 REQUEST_URI 实际上是 /index.php/facebook,而不是 /facebook。因此,任何对 https:// 的请求都将被重定向到 http://。

于 2012-12-20T17:12:02.500 回答