Apache RewriteRule与RewriteMap

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

 Guide 1 Mini-Guide 2 White Paper 3 

我将它包括到Apache通过

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

我想创build一个RewriteRule ,它只允许来自所述RewriteMap左侧的值处于这个位置;

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

我知道我可以在右边使用${legacy} ,但是我可以在左边使用它,如果是这样,怎么办?

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

改变你的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 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] 

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

但,
如果找不到捕获的值,可以指定一个默认值。 这条路:

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

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

然后,您可以用另一个规则重写那个结果,或者只是允许它通过,并在默认值的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]