使用RewriteMap协助RewriteRule

时间:2012-11-29 10:01:44

标签: apache mod-rewrite url-rewriting rewritemap

我对mod_rewrite很新,我试图让RewriteMap指令正常工作。感谢您使用它的帮助。

我们的网址格式如下:

example.com/section.php?xSec=[ID]

因此,对于第201节,即“Apple iPads”,URL为:

example.com/section.php?xSec=201

我想要的是将其重写为:

example.com/apple-ipads

我已经在apache配置中定义了RewriteMap txt文件,使用以下行:

RewriteMap sections txt:/var/www/rewrites/sections.txt

此txt文件包含以下内容:

multifunction-printers 102
inkjet-printers 103
laser-printers 104
apple-ipads 201

我在.htaccess中尝试了以下重写规则:

RewriteRule ^/section.php?xSec=(.*) ${sections:$1}

哪个不起作用。我假设我的RewriteRule存在问题,或者我将RewriteMap指令放在配置文件中的错误位置。有什么建议吗?

先谢谢

丹尼尔

2 个答案:

答案 0 :(得分:1)

您可以使用此重写:

RewriteRule ^/(.*) /section.php?xSec=${sections:$1|NOTFOUND}

对于发送到的每个请求:

example.com/apple-ipads

你应该透明地看到答案来自:

example.com/section.php?xSec=201

如果找不到密钥,答案来自:

example.com/section.php?xSec=NOTFOUND

但是你必须知道这个重写是行不通的,例如当你有一个可以由浏览器编码的空格或其他字符(àèò......)时。

答案 1 :(得分:0)

你的地图是倒退的。密钥应首先列出。

201 apple-ipads

我相信你不应该在模式的开头加上/加上其他一些东西;即,假设您的ID仅为数字,则更好的模式为:

RewriteRule  ^section\.php\?xSec=(\d+)$  ${sections:$1}  [nocase]


更新

我只需要用uri做一些htaccess工作,我需要grep查询字符串。这个excellent post帮助很大。以前的模式不起作用。这一个应该:

RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteRule   ^section\.php$   ${sections:%1}?  [nocase,redirect=perm,last]

如果您想在无法匹配(未经测试)密钥时默认使用原始查询字符串:

RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteRule   ^section\.php$   ${sections:%1?|$0?id=%1}  [nocase,redirect=perm,last]


更新2

上一个例子中的语法是错误的,因为?在$ {}函数的匹配方内。我已经使用类似的东西更新了自己的规则:

# mapped
RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteCond   ${sections:%1|NOTFOUND}   !NOTFOUND   [nocase]
RewriteRule   ^section\.php$   ${sections:%1}?  [nocase,redirect=perm,last]

使用这组规则,只有具有映射(查询)键的uri才会被重定向。

干杯。