代码之家  ›  专栏  ›  技术社区  ›  MikeiLL

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

  •  0
  • MikeiLL  · 技术社区  · 7 年前

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

    https://%{HTTP_HOST} 在所有的 RewriteRule s、 先处理更具体的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>
    

    0 回复  |  直到 7 年前
        1
  •  1
  •   MikeiLL    7 年前

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

    • 重定向的一个例子是从 http:// https:// 或添加或移除 www 子域。

    • 重写的一个例子是接收如下路径 /foo-bar-bas 在发送给服务器处理之前(通过ASP、Python、php、ruby on rails、node.js等),将其重写为 article.aspx?name=foo_bar_bar 或者是这样的。

    你可以在上面的操作中看到 http:// https:// ,当它位于规则块的顶部时,由于以下两个标志而使下面的重写短路:

    • R=301 它告诉浏览器,“这个(A)资源已经移动,现在在这个(B)位置”
    • L
    • 第三面旗, 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>
    

    令人困惑的是,我们使用“重写”规则来实现“重定向”(以及下面的重写) Redirect 指令超出 mod_rewrite 模块。我不确定这在这里是否可行。

    值得在上面重申@Ultimater的评论 测试时 ,使用 302 建立 与 301 状态代码 R 标志将阻止将错误消息发送到web爬虫程序或(可能是您自己的)浏览器。

    推荐文章