通过 .htaccess 进行 HTTPS/HTTP 重定向

通过 .htaccess 进行 HTTPS/HTTP 重定向

我有一个有点复杂的问题需要解决。我使用以下 .htaccess 指令来启用某种 Pretty URL,效果很好。例如,http://myurl.com/shop将被重定向至http://myurl.com/index.php/shop,并且运行良好(请注意,诸如 myurl.com/css/mycss.css 之类的内容)不会被重定向:

RewriteEngine on
RewriteCond ${REQUEST_URI} !^(index\.php$)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php/$1 [L]

但是现在,由于我已经将 SSL 引入到我的网页,我希望实现以下行为:我基本上希望除 admin.php 和 login.php 之外的所有页面都实现上述行为。对这两个页面的请求应重定向到 HTTPS 部分,而所有其他请求应按上述规定进行处理。

我想出了以下 .htaccess,但它不起作用。htps://myurl.com/shop 没有重定向到 htp://myurl.com/index.php/shop,和 htp://myurl.com/admin.php 没有重定向到 htps://myurl.com/admin.php。

RewriteEngine on

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^(admin\.php$|login\.php$)
RewriteRule ^(.*)$ http://%{HTTP_HOST}/${REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^(admin\.php$|login\.php$)
RewriteRule ^(.*)$  https://myurl.com/%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_URI} !^(index\.php$)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php/$1 [L]

我知道这与规则相互覆盖有关,但我不确定,因为我对 Apache 的了解非常有限。我该如何修复这个看似并不困难的问题,以及如何使我的 .htaccess 更紧凑、更优雅?

非常感谢您的帮助,谢谢!

答案1

我不得不这样回答,因为我的临时账户(即 cookie)丢失了。无论如何,我发现了一些有趣的事情。

我已经修复了您告诉我的 REQUEST_URI 中前导 / 的问题。

我在全局服务器配置中输入了 RewriteLog 和 RewriteLogLevel 指令(应该适用于 HTTP 和 HTTPS,对吗?)。

然后我发现,正如我在日志中看到的那样,所有 HTTP 请求都得到了正确处理,并且如愿以偿(!),但 HTTPS 请求根本没有被记录!因此,我认为日志记录配置不正确,或者(我担心的)HTTPS 请求甚至没有经过 mod_rewrite 过程。

再次,我使用 .htaccess 文件来设置我的重写规则。

因此,目前实际的问题是,HTTP 上的所有内容都会被正确重写,但是当我收到如下请求时https://myurl.org/shop,我希望它被重定向到http://myurl.org/shop,因为它既不是admin.php也不是login.php。

我不明白“(实际上根本不需要单独的 RewriteCond)”这一部分。谢谢!

以下是我更新的.htaccess 文件。

RewriteEngine on

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/(admin\.php$|login\.php$)
RewriteRule ^(.*)$ http://%{HTTP_HOST}${REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/(admin\.php$|login\.php$)
RewriteRule ^(.*)$  https://myurl.org%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_URI} !^/(index\.php$)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php/$1 [L]

相关内容