带有RewriteMap的Apache RewriteRule

时间:2009-12-15 18:33:01

标签: apache mod-rewrite rewritemap

我有RewriteMap看起来像这样:

Guide           1
Mini-Guide      2
White Paper     3

我将它包含在Apache通过

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

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

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

我知道我可以在右侧使用${legacy},但是我可以在左侧使用它吗?如果是的话,怎么用?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]

答案 2 :(得分:1)

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

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

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

将“defaultValue”替换为您喜欢的任何内容。例如,如果在地图中找不到给定的arg,则为0(零)或“未发现”。

然后,您可以使用其他规则重写该结果,或者只是允许它流过,并在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]