【问题标题】:.htaccess Adding HTTPS forcing to existing rewrite rules of subdirectory.htaccess 将 HTTPS 强制添加到子目录的现有重写规则中
【发布时间】:2017-06-08 19:47:33
【问题描述】:

可能我正在监督一些非常基本的事情,htaccess 不是我的专业领域。

我的网站是 https-only,为了实现这一点,根文件夹 / 包含以下几行:

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [R=301,L]

这很好用。现在我们有一个名为 /projects 的新文件夹,其中包含自己的 htaccess 规则,用于通过名为 /projects/project.html 的文件翻译数据库查询中的 url

文件夹 /projects 中的工作 htaccess 是:

RewriteEngine On 
RewriteBase /projects/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ project.html?project=$1 [QSA,L]

现在我想在这个上强制 https 连接,因为如果您直接通过http://URL 访问,主目录中的 https 规则不适用于 /projects。因此我将文件修改为:

RewriteEngine On 

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://example.com%{REQUEST_URI} [R=301,L,NE]

RewriteBase /projects/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ project.html?project=$1 [QSA,L]

这样,它切换到 https,但我不断收到“ERR_TOO_MANY_REDIRECTS”。

当我按照@thickguru 的建议更改行时,如下所示:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

它会立即将我重定向到https://example.com/index.html

我摆弄了设置,还有this post的信息,但我仍然无法让它工作。

【问题讨论】:

  • 你用的是什么版本的apache?
  • 我不确定我是否给出了正确的答案,但 phpinfo 提到了 Apache2,API 版本 20051115。如果我需要查看其他地方,请告诉我 :)

标签: apache .htaccess mod-rewrite https


【解决方案1】:

我刚刚注意到您要匹配的变量是 %{ENV:HTTPS} ,因此,您可以在 /projects/.htaccess 中使用以下规则:

RewriteEngine on

RewriteCond %{ENV:HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

清除浏览器缓存或尝试使用其他浏览器进行测试。

【讨论】:

  • 至少现在页面在 URL 中使用 https:// 时可以正确加载,完整代码现在是 RewriteEngine On RewriteCond %{ENV:HTTPS} !on RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R] RewriteBase /projects/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ project.html?project=$1 [QSA,L] 我现在在输入 URL 的 http 版本时得到 ERR_TOO_MANY_REDIRECTS。
  • 抱歉,重定向目的地有错字。请查看编辑
  • 啊啊,现在你指出来了,那个错字很明显,愚蠢的我没看到。这正是我正在寻找的解决方案。非常感谢每一位做出贡献的人。特别感谢@tickguru 的赏金!
  • @starkeen 什么是%{ENV:HTTPS} 我的意思是它与%{HTTPS} 有何不同?
  • @AbhishekGurjar 与 {HTTPS} 不同,{ENV:HTTPS} 是用户定义的变量。您可以使用 ENV 或 SETEnv 指令设置它,也可以使用 mod rewrite 的 E 标志设置它。
【解决方案2】:

在您的.htaccess 中使用它:

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://www.example.com%{REQUEST_URI} [R=301,L,NE]

另外,将其放在您的另一个 RewriteRule 上方,这样您的 .htaccess 将如下所示:

RewriteEngine On 

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://www.example.com%{REQUEST_URI} [R=301,L,NE]

RewriteBase /projecten/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ project.html?project=$1 [QSA,L]

编辑 - 试试这个:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

【讨论】:

  • 这不起作用,给出请求永远不会结束的错误。在地址栏中,URL 已更改为 HTTPS 变体
  • 我已经对代码进行了编辑。请使用新代码重试。另外,测试它也低于另一个RewriteRule
  • 我在两个命令中都尝试过,还尝试使用 R=301、L、NE 和 QSA 标签。但是,不断抛出错误。无法正确处理与 HTTPS 结合使用的现有规则
  • 这仍然是一个问题。还有什么建议吗? :)
  • 对不起,我帮不上忙。我已经为你开始赏金了。
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2015-08-04
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多