将方案重定向到https并继续执行路径规则

时间:2019-03-21 00:33:34

标签: apache .htaccess

我们的.htaccess文件中有一些基于路径的重写规则。例如,如果URI指向/foobar/somestring,则重定向到/foo/somestring页,但我们也想强制通过https加载资源。

我们可以在所有https://%{HTTP_HOST}中包括RewriteRule,首先解决更具体的URI,但是我很确定这不是必须的。

我已经浏览了apache flags docs,但是很难找到一种方法来告诉服务器以一种方式寻址scheme并继续阅读规则和条件来寻址paths

这是我们现在所拥有的长期使用的方法:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteCond %{REQUEST_URI}  ^/foo
  # Long list
  RewriteRule ^foobar/(bat.*)$ https://%{HTTP_HOST}/foo/$1 [L,R=301]
  RewriteRule ^foobar/(bas.*)$ https://%{HTTP_HOST}/foo/$1 [L,R=301]
  # URI not found
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^ https://%{HTTP_HOST}/index.php [L]
  # And finally
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L,NC]
</IfModule>

非常感谢。

1 个答案:

答案 0 :(得分:1)

此处的关键问题是了解the difference between a Redirect and a ReWrite。简而言之,重定向发生在客户端,更改了浏览器中的URL。重写发生在服务器端,对浏览器/客户端是透明的。

  • 重定向的示例是将协议从http://更改为https://,或者添加或删除www子域。

  • 一个Rewrite的例子是接收/foo-bar-bas之类的路径,然后将其发送给服务器以进行处理(通过ASP,Python,php,ruby on rails,node.js等) ),将其重写为article.aspx?name=foo_bar_bar或类似的内容。

您可以在上面的OP中看到从http://https://的重定向,当它位于规则块的顶部时,由于以下两个原因,正在使其下面的Rewrites短路标志:

  • R=301告诉浏览器,“此(A)资源已移动,现在位于此(B)位置”
  • L告诉Apache,“停止处理规则集”。
  • 第三个标志NC表示忽略大小写,而/?(.*)则不区分大小写。

所有需要的是:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1
  RewriteCond %{REQUEST_URI}  ^/foobar
  RewriteRule ^foobar/(bat.*)$ /foo/$1 [L,R=301]
  RewriteRule ^foobar/(bas.*)$ /foo/$1 [L,R=301]
</IfModule>

令人困惑的部分是,我们使用“重写”规则来实现“重定向”(及其下面的重写。)Apache还支持{{1}之外的Redirect指令}}模块。我不确定这是否可以在这里工作。

在测试期间,应该使用302 found 状态代码而不是301 mod_rewrite标志的“已永久移动”状态代码将防止将错误消息发送到Web搜寻器或(可能是您自己的)浏览器。