我一直在使用 RewriteMap dbm,我能够使用文本版本,但是无法弄清楚如何或为什么会出现下面描述的错误。
虚拟主机:
<VirtualHost *:80>
DocumentRoot /var/www/sites/me
ServerName domain.com
RewriteEngine On
RewriteMap examplemap "dbm:/etc/httpd/conf/redirects.db"
RewriteRule (.*) ${examplemap:$1}
</VirtualHost>
当我尝试重新启动 httpd 时,它会引发一个错误:
[root@mail me]# httpd -t
AH00526: Syntax error on line 367 of /etc/httpd/conf/httpd.conf:
RewriteMap: file for map examplemap not found:/etc/httpd/conf/redirects.dbm.dir
.dir 来自哪里?
我创建了一个 httxt2dbm 文件 redirects.db.dir,这使错误消失了。
如果我编辑以下行,会出现几个问题:
RewriteMap examplemap "dbm:/etc/httpd/conf/redirects.db"
到:
RewriteMap examplemap "dbm:/etc/httpd/conf/redirects.db.dir"
我得到:
RewriteMap: file for map examplemap not found:/etc/httpd/conf/redirects.dbm.dir.dir
第二个问题:
[root@mail me]# tail -f /var/log/httpd/error_log
[Wed Sep 19 20:32:42.282075 2018] [rewrite:error] [pid 4136] (2)No such file or directory: [client 50.76.6.29:56744] AH00663: mod_rewrite: can't access DBM RewriteMap file /etc/httpd/conf/redirects.db.pag
pag 文件来自哪里?
我怎样才能让这一切快乐并有效?
答案1
是的,仅创建了一个文件:
httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db
如果您在创建文件时指定db
(即 Berkeley DB)作为 DBM 类型(参数),那么您可能也应该在指令中包含此 dbm 类型。并且不是 Berkeley DB 文件,因此我怀疑 Apache 正在为您的重写映射使用另一个默认值(也许?)。-f DBM_TYPE
RewriteMap
.dir
.pag
SDBM
例如:
RewriteMap examplemap "dbm=db:/etc/httpd/conf/redirects.db"
或者,-f db
在创建数据文件时删除该参数(使用httxt2dbm
),以便 Apache 使用它的默认(除非您特别想要 Berkeley DB 文件。)