2

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

Guide           1
Mini-Guide      2
White Paper     3

我将它包含在Apachevia

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

我想创建一个RewriteRule只允许左侧的值RewriteMap在这个位置;

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

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

4

3 回答 3

7

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

将您的 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

于 2009-12-15T18:36:12.720 回答
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]
于 2013-03-16T10:02:34.190 回答
1

您说,您只想允许在地图中找到的值。除非您在正则表达式中为捕获组指定附加限制,否则这是不可能的。地图本身无法做到这一点。据我所知,没有“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]
于 2009-12-15T18:45:22.550 回答