【问题标题】:How to check is uri exists in rewritemap else goto 404 page?如何检查 uri 是否存在于 rewritemap 中,否则转到 404 页面?
【发布时间】:2017-02-05 17:07:25
【问题描述】:

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

最初这段代码的目的是:

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

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

RewriteCond %{REQUEST_URI} ^/en/home/categories/.*
RewriteMap plp-map  dbm:${http.server.install.base}/dynamicmaps/plp-map
RewriteCond ${plp-map:$1} =""
RewriteRule .? - [S=2]
    RewriteCond %{REQUEST_URI} ^/en/home/categories/.*
    RewriteRule ^(.*) ${plp-map:$1} [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 不应该总是返回 url 吗?不知何故,我错过了将 url 传递给条件检查映射条目的部分。如何解决这个问题?我的问题还有更好的解决方案吗?

【问题讨论】:

    标签: apache mod-rewrite rewritemap


    【解决方案1】:

    不,$1 不返回 URL。它返回当前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:$1} =""
    RewriteRule ^(/en/home/categories/.*)$ - [R=404,L]
    

    如果您还要更改它,请在上面添加:

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

    【讨论】:

    • phew.. 这解决了我的问题并简化了规则。谢谢。
    猜你喜欢
    • 2018-10-11
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-03-17
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多