首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有RewriteMap的Apache RewriteRule

带有RewriteMap的Apache RewriteRule
EN

Stack Overflow用户
提问于 2009-12-16 02:33:01
回答 3查看 4.4K关注 0票数 2

我有一个看起来像这样的RewriteMap

代码语言:javascript
复制
Guide           1
Mini-Guide      2
White Paper     3

我将它包含到Apache中,通过

代码语言:javascript
复制
RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt

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

代码语言:javascript
复制
RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2

我知道我可以在右边使用${legacy},但是我可以在左边使用它吗?如果可以,如何使用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-16 02:36:13

在地图文件中,左侧是关键字,右侧是值。当您创建匹配映射的规则时,您输入关键字,它将输出值。

将您的RewriteRule更改为:

代码语言:javascript
复制
# 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

代码语言:javascript
复制
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

票数 7
EN

Stack Overflow用户

发布于 2013-03-16 18:02:34

另一种变体:

代码语言:javascript
复制
# %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
EN

Stack Overflow用户

发布于 2009-12-16 02:45:23

您说过,您希望只允许在映射中找到的值。除非您在正则表达式中为捕获组指定了额外的限制,否则这是不可能的。地图本身是无法做到这一点的。据我所知,没有"map.keys“语法可以应用于左侧的pattern。

但,

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

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

将"defaultValue“替换为您喜欢的任何内容。例如0(零)或"notfound",如果在映射中找不到给定的参数。

然后,您可以使用另一个规则重写结果,或者只允许它流过,并在URL处提供一条具有默认值的"404“消息。

如果您选择使用其他规则,则它将如下所示:

代码语言:javascript
复制
## 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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1909438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档