Apache .htaccess中的数字基转换

Apache .htaccess中的数字基转换,apache,.htaccess,math,mod-rewrite,base,Apache,.htaccess,Math,Mod Rewrite,Base,我打算对表单执行url重定向: 发件人: 进入 在此重定向中,id的基从16更改为10 我想知道使用.htaccess是否可以实现这一点。在.htaccess中进行计算是不可能的。但是您可以将请求发送到PHP(或其他一些语言)脚本,在该脚本中执行计算,然后使用header函数执行重定向。您可以使用外部程序映射(prg:)。这是mod rewrite甚至RewriteMap的一种非常先进的用法 RewriteLock /var/lock/rewritemaplock.lock RewriteMap

我打算对表单执行url重定向:

发件人:

进入

在此重定向中,id的基从16更改为10


我想知道使用.htaccess是否可以实现这一点。在.htaccess中进行计算是不可能的。但是您可以将请求发送到PHP(或其他一些语言)脚本,在该脚本中执行计算,然后使用header函数执行重定向。

您可以使用外部程序映射(prg:)。这是mod rewrite甚至RewriteMap的一种非常先进的用法

RewriteLock /var/lock/rewritemaplock.lock
RewriteMap base16to10 prg:/somewher/modrewritemapbase16to10.pl
RewriteRule - ${base16to10:%{REQUEST_URI}}
对于perl脚本(或任何其他语言),未经测试

#!/usr/bin/perl
$| = 1; # Turn off I/O buffering
while ($uri=<STDIN>) {
    sprintf("/someResourse/id/%d",hex($uri)); 
}
#/usr/bin/perl
$| = 1; # 关闭I/O缓冲
而($uri=){
sprintf(“/someresource/id/%d”,十六进制($uri));
}
您可能需要测试和扩展程序,至少在出现错误时需要返回“NULL”字符串。如果不应转换其他url,则在调用此重写规则之前,您可能还需要添加一些RewriteCond


对于base 16到10重写器,您可以使用其他语言。

这是推荐的解决方案。另一种方法——与MapType一起使用:prg(外部重写程序)——基本相同,但执行方式不同。:)谢谢@regilero。但是添加
RewriteLock/test.lock
RewriteMap base16to10 prg:/baseConvert.php
会导致内部服务器错误(错误500)。有什么建议吗?重写锁是一个物理路径,在磁盘上,您可能无法在根文件系统(/)上写入任何内容,php脚本也是如此,请给出完整的磁盘路径,并检查apache错误。log@MdOliya、@regilero
RewriteLock
RewriteMap
都不能在.htaccess文件中声明(因此出现500错误)--仅在服务器配置/虚拟主机上下文中:@LazyOne:当然,谢谢,因此使用
标记而不是.htaccess文件应该可以做到这一点(.htaccess文件不好)。@regilero正如您看到的,许多人都不知道这一点(我指的是那些提问的人)。因此,在给出建议时,你真的应该提到这一小时刻,以避免混淆(答案绝对不错,只是缺少这一解释)。另一方面,OP询问是否可以使用.htaccess(仅?)。
RewriteLock /var/lock/rewritemaplock.lock
RewriteMap base16to10 prg:/somewher/modrewritemapbase16to10.pl
RewriteRule - ${base16to10:%{REQUEST_URI}}
#!/usr/bin/perl
$| = 1; # Turn off I/O buffering
while ($uri=<STDIN>) {
    sprintf("/someResourse/id/%d",hex($uri)); 
}