mod_rewrite用于尾随斜杠问题

时间:2008-10-01 17:47:09

标签: apache mod-rewrite

我把头发拉出来应该是一个非常简单的问题。我们通过F5 BigIP运行WebSphere IHS(Apache)。 BigIP正在为我们进行https翻译。我们的网址(已更改为网络,无效)为https://superniftyserver.com/lawson/portal

当有人在门户网站之后没有斜杠的情况下输入时,Apache会将“portal”视为文件而不是目录。当Apache发现它是什么时,它会发送301永久重定向。但由于Apache只知道http,它会将URL发送为http://superniftyserver.com/lawson/portal/,然后会产生问题。

所以我尝试了mod_rewrite的服务器级httpd.conf更改,这是我尝试过的几十种组合之一。

RewriteEngine on RewriteRule ^ / lawson / portal(。*)/ lawson / portal / $ 1

我也试过了 RewriteRule ^ / lawson / portal $ / lawson / portal /

还有很多其他的事情......我错过了什么?

4 个答案:

答案 0 :(得分:6)

如果你无法得到RewriteRule语法的答案,可以选择以下两个选项:在BigIp上编写一个自定义iRule(参见F5 DevCentral),查找301个响应并将其转换为SSL;让URL传递到您的WebSphere服务器并执行发送HTTPS的编程重定向。但是,由于F5终止了SSL连接,因此您必须设置自己配置的自定义标头(请参阅PQ86347),以便Java request.getScheme()按预期工作。

答案 1 :(得分:5)

固定!

SOL6912:配置HTTP配置文件以重写URL,以便从HTTP服务器重定向指定HTTPS协议


更新时间:8/7/07 12:00 AM

ClientSSL虚拟服务器通常配置为接受来自客户端的HTTPS连接,解密SSL会话,并将未加密的HTTP请求发送到Web服务器。

当请求的URI不包含斜杠(正斜杠,例如/,在URI的末尾)时,某些Web服务器会生成礼貌重定向。如果没有尾部斜杠,Web服务器将首先将URI中指定的资源视为文件。如果找不到该文件,Web服务器可能会搜索具有相同名称的目录,如果找到,请使用尾部斜杠将HTTP 302重定向响应发送回客户端。重定向将以HTTP模式而不是HTTPS返回到客户端,导致SSL会话失败。

以下是HTTP 302重定向响应如何导致SSL会话失败的示例:

·要请求SSL会话,用户键入https://www.f5.com/stuff而不使用尾部斜杠。

·客户端浏览器向ClientSSL虚拟服务器发送SSL请求,该服务器驻留在BIG-IP LTM系统上。

然后,BIG-IP LTM系统解密请求并向Web服务器发送GET / stuff命令。

·由于/ stuff文件在Web服务器上不存在,但存在/ stuff /虚拟目录,因此Web服务器会为该目录发送HTTP 302重定向响应,但会向该资源附加一个尾部斜杠。当Web服务器发送HTTP 302重定向响应时,它指定HTTP(而不是HTTPS)。

·当客户端收到HTTP 302重定向响应时,它会向BIG-IP LTM虚拟服务器发送一个指定HTTP(而不是HTTPS)的新请求。因此,SSL连接失败。

配置HTTP配置文件以重写URL

在BIG-IP LTM版本9.x中,您可以配置HTTP配置文件以重写URL,以便从HTTP服务器重定向指定HTTPS协议。为此,请执行以下步骤:

  1. 登录配置实用程序。

  2. 单击“本地流量”。

  3. 点击个人资料。

  4. 单击“创建”按钮。

  5. 键入配置文件的名称。

  6. 从“父配置文件”下拉菜单中选择http。

  7. 在“设置”下,将“重定向重写”设置为“全部”,“匹配”或“节点”,具体取决于您的配置

  8. 例如:

    o选择全部以将任何HTTP 301,302,303,305或307重定向重写为HTTPS

    o当请求的路径和查询URI组件以及重定向相同时,选择“匹配”以重写重定向(尾部斜杠除外)

    o当重定向URI包含节点IP地址而不是主机名时,选择节点重写重定向,并且您希望系统将其更改为虚拟服务器地址

    1. 点击完成。
    2. 您现在必须将新HTTP配置文件与ClientSSL虚拟服务器关联。

答案 2 :(得分:1)

试试这个:

# Trailing slash problem
RewriteCond    %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule    ^(.+[^/])$           https://<t:sitename/>$1/ [redirect,last]

答案 3 :(得分:0)

LoadModule rewrite_module                modules/mod_rewrite.so

确保该行位于httpd.conf文件中的某个位置