mod_rewrite用于尾部斜杠问题

时间:2020-03-06 14:59:20  来源:igfitidea点击:

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

当有人在门户网站后输入不带斜线的内容时,Apache会认为"门户网站"是文件而不是目录。当Apache找到它是什么时,它将发送301永久重定向。但是由于Apache仅知道http,因此它以http://superniftyserver.com/lawson/portal/的形式发送URL,这会造成问题。

因此,我尝试将服务器级别的httpd.conf更改为mod_rewrite,这是我尝试过的数十种组合之一。

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

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

除其他外...我想念什么?

解决方案

LoadModule rewrite_module                modules/mod_rewrite.so

确保该行在httpd.conf文件中的某处

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

固定的!

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

更新时间:2007年8月7日上午12:00

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时不能带斜杠。

     客户端浏览器向位于BIG-IP LTM系统上的ClientSSL虚拟服务器发送SSL请求。

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

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

     当客户端收到HTTP 302重定向响应时,它将向指定HTTP(而非HTTPS)的BIG-IP LTM虚拟服务器发送新请求。结果,SSL连接失败。

配置HTTP配置文件以重写URL

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

  • 登录到配置实用程序。
  • 单击本地流量。
  • 单击个人资料。
  • 单击创建按钮。
  • 输入配置文件的名称。
  • 从"父级配置文件"下拉菜单中选择" http"。
  • 在"设置"下,根据配置将"重定向重写"设置为"全部","匹配"或者"节点"

例如:

o选择全部重写任何HTTP 301、302、303、305或者307重定向到HTTPS

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

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

  • 单击完成。

现在,我们必须将新的HTTP配置文件与ClientSSL虚拟服务器相关联。

试试这个:

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