Apache 使用RewriteMap帮助重写规则

Apache 使用RewriteMap帮助重写规则,apache,mod-rewrite,url-rewriting,rewritemap,Apache,Mod Rewrite,Url Rewriting,Rewritemap,我是mod_rewrite的新手,我正在尝试让RewriteMap指令正常工作。如果你能帮我使用它,我将不胜感激 我们的URL格式如下: example.com/section.php?xSec=[ID] 因此,对于第201节,即“苹果iPad”,URL为: example.com/section.php?xSec=201 我想把它改写成: example.com/apple-ipads 我已使用以下行在apache配置中定义了RewriteMap txt文件: RewriteMap se

我是mod_rewrite的新手,我正在尝试让RewriteMap指令正常工作。如果你能帮我使用它,我将不胜感激

我们的URL格式如下:

example.com/section.php?xSec=[ID]
因此,对于第201节,即“苹果iPad”,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指令放在配置文件的错误位置。有什么建议吗

提前谢谢


丹尼尔

您可以使用此重写:

RewriteRule ^/(.*) /section.php?xSec=${sections:$1|NOTFOUND}
对于发送到以下地址的每个请求:

example.com/apple-ipads
你应该清楚地看到答案来自:

example.com/section.php?xSec=201
example.com/section.php?xSec=NOTFOUND
如果找不到钥匙,答案来自:

example.com/section.php?xSec=201
example.com/section.php?xSec=NOTFOUND

但您必须知道,此重写无法工作,例如,当您有一个空格或其他字符(èò…)可以通过浏览器进行编码时。

您可以使用此重写:

RewriteRule ^/(.*) /section.php?xSec=${sections:$1|NOTFOUND}
对于发送到以下地址的每个请求:

example.com/apple-ipads
你应该清楚地看到答案来自:

example.com/section.php?xSec=201
example.com/section.php?xSec=NOTFOUND
如果找不到钥匙,答案来自:

example.com/section.php?xSec=201
example.com/section.php?xSec=NOTFOUND

但您必须知道,这种重写无法工作,例如,当您有一个空格或其他字符(èò…)可以通过浏览器进行编码时。

您的地图是向后的。应该首先列出密钥

201 apple-ipads
我相信你不应该在模式的开头加上/和其他一些东西;i、 例如,假设您的ID只是数字,更好的模式是:

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

更新 我刚刚不得不对uri做一些htaccess工作,在那里我需要grep查询字符串。这帮了大忙。以前的模式不起作用。这一个应该:

RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteRule   ^section\.php$   ${sections:%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才会被重定向


干杯。

你的地图倒了。应该首先列出密钥

201 apple-ipads
我相信你不应该在模式的开头加上/和其他一些东西;i、 例如,假设您的ID只是数字,更好的模式是:

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

更新 我刚刚不得不对uri做一些htaccess工作,在那里我需要grep查询字符串。这帮了大忙。以前的模式不起作用。这一个应该:

RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteRule   ^section\.php$   ${sections:%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才会被重定向

干杯