我有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}
,但是我可以在左侧使用它吗?如果是的话,怎么用?
答案 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
),则运行下一个规则。否则,跳过规则并继续。
答案 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]