【问题标题】:mod_rewrite for trailing slash problemmod_rewrite 用于尾随斜杠问题
【发布时间】:2010-09-14 14:28:53
【问题描述】:

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

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

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

重写引擎开启 重写规则 ^/lawson/portal(.*) /lawson/portal/$1

我也试过 重写规则 ^/lawson/portal$ /lawson/portal/

在许多其他事情中......我错过了什么?

【问题讨论】:

  • 这可能是一个奇怪的问题,但是 BigIP 是否以其他方式更改 URL?
  • 一开始我们是这么认为的,但是这肯定是 Apache 的斜杠问题...

标签: apache mod-rewrite


【解决方案1】:

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

【讨论】:

  • 非常感谢,如果我无法让重写器正常工作,这看起来是我目前最好的选择......
【解决方案2】:

已修复!

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 命令。

· 由于 /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 协议。为此,请执行以下步骤:

  1. 登录到配置实用程序。

  2. 单击本地流量。

  3. 单击配置文件。

  4. 单击“创建”按钮。

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

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

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

例如:

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

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

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

  1. 单击完成。

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

【讨论】:

    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:
      LoadModule rewrite_module                modules/mod_rewrite.so
      

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

      【讨论】:

      • 谢谢,我应该提到...我确实有未注释的行... LoadModule rewrite_module modules/mod_rewrite.so
      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 2011-02-20
      • 1970-01-01
      • 2011-06-28
      • 2023-03-19
      • 2020-05-20
      • 2011-05-15
      • 2012-09-25
      相关资源
      最近更新 更多