代码之家  ›  专栏  ›  技术社区  ›  Ben Gribaudo

一起使用时重写规则行为更改

  •  0
  • Ben Gribaudo  · 技术社区  · 15 年前

    下面设置的每个规则单独使用时都可以正常工作。但是,当一起使用时,规则的行为会发生变化。

    当规则集2本身被使用时,请求 https://internal/Security/login 由Apache重写为sapphire/main.php,而不需要浏览器的知识。这是预期的行为。

    当两个规则集一起使用时,对前面提到的URL的请求会导致Apache发送301重定向到 http://internal/sapphire/main.php?url=Security/login .

    为什么Apache发送这个重定向而不是进行内部重写?

    # Rule Set # 1
    # - Forces all HTTPS requests to HTTP, except for security section requests.
    #   Example: request for https://internal/abc/ 
    #   -> redirected to http://internal/abc/
    RewriteCond %{SERVER_PORT} =443
    RewriteCond %{REQUEST_URI} !^/Security($|/.*$)
    RewriteRule (.*) http://internal/$1 [R=301,L]
    
    # Rule Set # 2
    # - Hands request to CMS - web user does not see this behind-the-scenes rewrite
    RewriteRule (.*) sapphire/main.php?url=$1&%{QUERY_STRING} [L]
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Gumbo    15 年前

    这个 L 标志导致对已重写的URL进行重新注入。因此,请尝试分析原始请求的URL:

    RewriteCond %{SERVER_PORT} =443
    RewriteCond %{THE_REQUEST} ^[A-Z]+\ /Security[/?\ ]
    RewriteRule (.*) http://internal/$1 [R=301,L]