【问题标题】:Redirect in htaccess to folder and https在 htaccess 中重定向到文件夹和 https
【发布时间】:2020-01-27 19:25:46
【问题描述】:

使用 htaccess 我想强制 http 到 https 并同时重定向到 www。以及我的应用程序文件所在的“公共”文件夹。 结果应该是http://example.com应该重定向到https://www.example.com/public/

要重定向到我管理的 https 和 www:

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

通过使用重定向到我管理的“公共”文件夹:

ReWriteCond %{REQUEST_URI} !^public/
ReWriteRule ^(.*)$ public/$1 [L]

现在我需要将这些结合起来,但我的多次尝试并没有导致重定向有效,因此我需要一些建议。

编辑: 在 public 文件夹中是另一个 htaccess 文件:

 SetEnv APPLICATION_ENV "production"
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} -s [OR]
 RewriteCond %{REQUEST_FILENAME} -l [OR]
 RewriteCond %{REQUEST_FILENAME} -d
 RewriteRule ^.*$ - [NC,L]
 RewriteRule ^.*$ /index.php [NC,L]

【问题讨论】:

  • 你能显示你的完整的.htaccess
  • ReWriteRule ^(.*)$ public/$1 [L] - 请注意,这是内部重写,而不是“重定向”(这意味着外部重定向)问题中说明。大概您的网址实际上不包含/public 子目录,并且不会向您的用户公开?
  • @MrWhite 是正确的。这是内部重写。
  • @anubhava 在这一点上这是我的 htaccess,RewriteEngine On 在上面。
  • 这些规则是正确的,问题所示的顺序也是正确的。

标签: .htaccess redirect mod-rewrite https


【解决方案1】:
ReWriteCond %{REQUEST_URI} !^public/
ReWriteRule ^(.*)$ public/$1 [L]

REQUEST_URI 服务器变量以斜杠开头,因此上述条件永远不会匹配。例如:

RewriteCond %{REQUEST_URI} !^/public/
RewriteRule (.*) public/$1 [L]

但是,假设您在 /public 子目录中有另一个 .htaccess 文件,我将改为如下编写此块:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) public/$1 [L]

这还有一个额外的好处,即允许在 URL 的开头使用 public 路径段(如果您愿意)。例如。 URL /public/foo 将在内部重写为 /public/public/foo,而不会创建重写循环。

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

您在第一个条件下缺少OR 标志。例如:

RewriteCond %{HTTPS} off [OR]
:

否则,它将无法将http://www.example.com/ 重定向到 HTTPS。

澄清一下,规范重定向应该在内部重写到 public 目录之前进行。


更新:

编辑:在 public 文件夹中是另一个 htaccess 文件:

SetEnv APPLICATION_ENV "production"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

最后一个 RewriteRule 指令上的 substitution 字符串不正确。您需要从/index.php 中删除斜杠前缀。它应该只是阅读index.php。否则,它将把请求重写回文档根目录(文件系统路径)并导致无限循环或 404(取决于父指令)。通过将其更改为index.php(无斜线),它现在相对于/public 目录(包含.htaccess 文件的目录),而不是文档根目录。

您还可以简化RewriteRule 模式,这里不需要NC 标志。因此,总而言之,/public/.htaccess 文件应为:

SetEnv APPLICATION_ENV "production"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^ index.php [L]

【讨论】:

  • 我一直在测试,但没有成功。重定向到 https 现在可以了,但随后它停止了。使用 htaccess 测试器,它说条件 RewriteCond %{REQUEST_URI} !^/public/RewriteCond %{ENV:REDIRECT_STATUS} ^$ 不满足。
  • 您要的网址是什么?这些是您在根 .htaccess 文件中拥有的唯一指令吗? (重写前的 HTTPS 重定向)/public 子目录中是否还有另一个 .htaccess 文件? (如果有,这个.htaccess 文件中有什么内容?)
  • 我已经从/public 子目录中添加了另一个.htaccess 文件。我正在测试的 url 请求是http://example.com。使用您建议的选项,我可以得到:The requested URL was not foundtoo many redirects
  • 啊,/public/.htaccess 不正确。您需要从/index.php 中删除斜杠前缀,以变为index.php。我已经更新了我的答案。
  • 原来有一个 Https 请求处理程序插件处于活动状态,由于某种原因重定向回 http 导致所有麻烦。在您的帮助和以上更改下,它现在正在运行。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-03-16
  • 2011-06-13
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多