【问题标题】:Apache RewriteRule with RewriteMapApache RewriteRule 与 RewriteMap
【发布时间】:2009-12-15 18:33:00
【问题描述】:

我有一个看起来像这样的RewriteMap

Guide           1
Mini-Guide      2
White Paper     3

我将它包含在Apache via中

RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt

我想创建一个RewriteRule,它只允许所述RewriteMap左侧的值位于此位置;

RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2

我知道我可以在右侧使用${legacy},但我可以在左侧使用它吗?如果可以,如何使用?

【问题讨论】:

    标签: apache mod-rewrite rewritemap


    【解决方案1】:

    在您的地图文件中,左侧是键,右侧是值。当您创建匹配映射的规则时,您输入键并输出值。

    将您的 RewriteRule 更改为:

    # Put these on one line
    RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
                /blah.php?subsection=${legacy:$1}&title=$2
    

    第一个分组捕获传入 URL 中的字符串。替换中的 $1 将其应用于命名地图。要设置默认值,请将${legacy:$1} 更改为${legacy:$1|Unknown}

    最后,如果您只希望规则对映射文件中的值起作用,请添加RewriteCond

    RewriteCond ${legacy:$1|Unknown} !Unknown
    # Put these on one line
    RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
                /blah.php?subsection=${legacy:$1}&title=$2
    

    条件表示如果映射没有返回默认值 (Unknown),则运行下一条规则。否则,跳过规则并继续。

    Apache RewriteMap

    【讨论】:

    • 但我不想匹配任何字符串。我只想要来自RewriteMap 的那些。另外,他们中的一些人的值中可能有一个/,所以我需要它是具体的。
    • @gms8994:您应该验证 PHP 脚本中的实际输入,而不是重写映射。
    【解决方案2】:

    另一种变体:

    # %1 will be the subpattern number1 afterwards
    RewriteCond %{REQUEST_URI} ^/section/downloads/(.*)
    # check if there is no mapping for %1
    RewriteCond ${legacy:%1} !^$
    # if there is rewrite it
    RewriteRule ^/(.*) /blah.php?subsection=${legacy:%1}&title=$2 [R]
    

    【讨论】:

      【解决方案3】:

      您说过,您只想允许在地图中找到的值。除非您在正则表达式中为捕获组指定附加限制,否则这是不可能的。地图本身无法做到这一点。据我所知,没有“map.keys”语法可以应用于左侧的模式。

      但是,
      如果未找到捕获的值,您可以指定默认值。这样:

      ## all on one line
      RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
              /blah.php?subsection=${legacy:$1|defaultValue}&title=$2
      

      用你喜欢的任何东西替换“defaultValue”。例如 0(零)或“notfound”,如果在地图中找不到给定的 arg。

      然后,您可以使用另一个规则重写该结果,或者只允许它通过并在 URL 处提供具有默认值的“404”消息。

      如果你选择使用另一个规则,那么它看起来像这样:

      ## all on one line
      RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
              /blah.php?subsection=${legacy:$1|notFoundMarker}&title=$2
      
      ## This rule fires if the lookupKey was not found in the map in the prior rule.
      RewriteRule ^/blah.php?subsection=notFoundMarker  /404.php   [L]
      

      【讨论】:

        猜你喜欢
        • 2012-11-17
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 2020-07-17
        • 2018-09-30
        • 1970-01-01
        • 2012-02-29
        相关资源
        最近更新 更多