如何检查 uri 是否存在于 rewritemap else goto 404 页面中?

How to check is uri exists in rewritemap else goto 404 page?

我的要求是检查 url 是否存在于重写映射文件中。如果不存在,它应该显示状态代码为 404 的自定义 404 页面。

最初这段代码的用途是:

RewriteMap plp-map  dbm:${http.server.install.base}/dynamicmaps/plp-map
RewriteCond %{REQUEST_URI} ^/en/home/categories/.*
RewriteRule ^(.*) ${plp-map:|/content/mysite/en_ca/home/errors/404.html} [PT,QSA]

正在加载 /invalid.html 的自定义 404 页面。但是状态是 200。接下来我将规则详细说明为 goto ErrorDocument if not exists in map;否则重定向。如下:

RewriteCond %{REQUEST_URI} ^/en/home/categories/.*
RewriteMap plp-map  dbm:${http.server.install.base}/dynamicmaps/plp-map
RewriteCond ${plp-map:} =""
RewriteRule .? - [S=2]
    RewriteCond %{REQUEST_URI} ^/en/home/categories/.*
    RewriteRule ^(.*) ${plp-map:} [PT,QSA]    
    RewriteRule .? - [S=1]  
RewriteRule ^(.*)$ - [L,R=404]
ErrorDocument 404 /content/homedepot_ca/en_ca/home/errors/404.html

现在这条规则在第三行 RewriteCond ${plp-map:$1} ="" 失败并出现错误

 map lookup FAILED: map=plp-map[dbm] key=

$1 不应该总是 return url 吗?不知何故,我错过了将 url 传递到条件检查地图条目的部分。如何解决这个问题?还有我的问题有更好的解决方案吗?

不,</code> 不 return URL。它 return 是您当前 <code>RewriteRule 正则表达式中捕获的第一组的结果。

您实际上是在用您的地图更改 URL,还是只是测试一下?如果只是测试,你只需要:

RewriteMap plp-map  dbm:${http.server.install.base}/dynamicmaps/plp-map
ErrorDocument 404 /content/homedepot_ca/en_ca/home/errors/404.html

RewriteCond ${plp-map:} =""
RewriteRule ^(/en/home/categories/.*)$ - [R=404,L]

如果您也要更改它,请在上面的内容之后添加:

RewriteCond ${plp-map:} !=""
RewriteRule ^(/en/home/categories/.*)$ ${plp-map:} [PT,QSA]