我有一个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]