我有一个看起来像这样的RewriteMap:
Guide 1
Mini-Guide 2
White Paper 3我将它包含到Apache中,通过
RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt我想创建一个只允许来自所述RewriteMap左侧的值位于此位置的RewriteRule;
RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2我知道我可以在右边使用${legacy},但是我可以在左边使用它吗?如果可以,如何使用?
发布于 2009-12-16 02:36:13
在地图文件中,左侧是关键字,右侧是值。当您创建匹配映射的规则时,您输入关键字,它将输出值。
将您的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
发布于 2013-03-16 18:02:34
另一种变体:
# %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]发布于 2009-12-16 02:45:23
您说过,您希望只允许在映射中找到的值。除非您在正则表达式中为捕获组指定了额外的限制,否则这是不可能的。地图本身是无法做到这一点的。据我所知,没有"map.keys“语法可以应用于左侧的pattern。
但,
如果未找到捕获的值,则可以指定默认值。这样:
## 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]https://stackoverflow.com/questions/1909438
复制相似问题