我有一个内置于 codeigniter 的网站。我们使用数据库中的短 url 和重写规则将它们重定向到它们的完整路径。
例如,
RewriteRule ^secure-form$ form/contract/secure-form [L]
这本身就可以正常工作。但我想在某些页面上使用 SSL。我已经编辑了代码,因此如果您转到这些页面之一,页面中的所有 http:// 实例都将替换为 https:// 但我还需要重写 url 才能使用它。
这些页面都使用相同的模板,所有内容都来自数据库,所以我不能只在特定目录上指定 ssl。
安全页面的 url 都以“secure”开头,所以我编写了以下规则并将它们放在其他重写之上。
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure/?.*$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/secure/?.*$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^secure-form$ form/contract/secure-form [L]
RewriteRule ^secure-different-form$ form/contract/secure-different-form [L]
all other rewrite rules for specific pages follow
then the default rewrite further down...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
问题是当我添加规则来更改协议时,它最终会在 url 中显示“form/contract/secure-form”而不是“secure-form”。
这会使页面上的实际表单损坏,因为它使用该 url 来构建自己。
如果我取出更改协议的规则,它会在 url 中显示安全表单,但页面不安全。
我究竟做错了什么?
----更新---- 哦,经过20多个小时的搜索,我想我终于有了答案。因此,第一次通过时,https 关闭并打开。然后,由于 301,它再次运行,页面被发送到 form/contract/secure ......但这一次,https 开启。由于 uri 不再以安全开头,因此它会关闭 https。
希望这会对其他人有所帮助。