具有复杂条件的htaccess文件

时间:2018-12-02 13:17:17

标签: apache .htaccess mod-rewrite url-rewriting

我有一个复杂的mod重写规则,我需要开始工作。情况是,我的客户的域使用HTTPS,但是在特定部分上需要使用HTTP才能使websocket正常工作。 我需要做的是以下几点: 如果该网址中包含“ / view-auctions /”字符串,而该网址中没有/ login /,则它需要提供HTTP服务。否则,它需要服务器HTTPS。 这是我到目前为止所拥有的

ArrayNode

这很好用,除了在URL中同时出现两个都带有“ / login /” /“ / view-auctions /”的URL之外,它应该是HTTPS而不是HTTP。

我在google上和stackoverflow上都看过,但是到目前为止,我还没有找到实现该目标的理智方法。不可否认,我对htaccess文件的理解是初学者。

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,经过更多摆弄并进一步阅读文档后,我明白了。我提供的答案是为了帮助处于类似情况的其他人,并希望为遇到类似问题的人提供更多的清晰度。

我发现最令人困惑的主要事情之一是弄清楚htaccess文件中使用的总体逻辑和控制结构。我原本以为我需要声明。我发现我过分复杂了。

在大多数情况下,htaccess文件都是自上而下处理的,并按照指令在文件中出现的顺序进行操作。请记住,这意味着如果您不小心,可能会意外覆盖先前的声明。解决方案是在第三行下方添加另一行

RewriteCond %{THE_REQUEST} !/login/ [NC]

所以看起来像这样

  # for /view-auctions/ enforce http
  RewriteCond %{HTTPS} on
  RewriteCond %{THE_REQUEST} /view-auctions/ [NC]
  RewriteCond %{THE_REQUEST} !/login/ [NC]
  RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  # except for /view-auctions/ enforce https
  RewriteCond %{HTTPS} off
  RewriteCond %{THE_REQUEST} /view-auctions/ [NC]
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

由于以前的开发人员创建系统的方式以及客户端想要使用SSL证书的方式,我不得不找到一种方法来允许所有“ / view-auctions /” URL显示HTTP,以便WebSocket仍能正常工作。然后,我必须确保IF'/ login /'AND'/ view-auctions /'位于我通过HTTPS连接为其提供服务的URL中。

因此,我首先进行测试以查看URL中是否包含“ / view-auctions /”,然后进行测试以确保URL中不包含“ / login /”。这样,只要URL中没有“ / login /”,“ / view-auctions /” URL就会继续在HTTP上起作用。

Admittidley我可能并没有以最好的方式来解释这一点,正如我在我的OP中所说,我是最精通htaccess文件的初学者。