AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 941090
Accepted
Donna Delour
Donna Delour
Asked: 2018-11-22 08:19:26 +0800 CST2018-11-22 08:19:26 +0800 CST 2018-11-22 08:19:26 +0800 CST

如果找不到 REQUEST_URI,如何排除 RewriteMap

  • 772

我有一个旧网站 wordpress 网站,我正在迁移。

大约有 50000 个 URL 需要重定向。

为此,我正在使用似乎工作正常的 DBM 文件,但是在负载测试期间,我注意到每个请求都损失了大约 0.5 秒。

查看日志,看起来每次都有 50000 的 DBM 文件被命中。

我将 DBM 从 50000 更改为 10000,并注意到来自 50000 DBM 文件的每个请求我获得了大约 0.25 秒。

我希望能够做这样的事情,但是无论我如何混合和匹配代码,我都无法让它工作:

<If "%{REQUEST_URI} =~ m#^abc#">
    RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond ${abcredirects:$1} !=""
        RewriteRule ^(.*) /${abcredirects:$1} [R=301,L]
    </IfModule>
</If>

<If "%{REQUEST_URI} =~ m#^xyz#">
    RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond ${xyzredirects:$1} !=""
        RewriteRule ^(.*) /${xyzredirects:$1} [R=301,L]
    </IfModule>
</If>

使用上面的 sudo 代码我怎样才能让它工作?

IE。

如果 urlexample.com/abc12345.htm查看abcredirects.dbmelse 退出到 VirtualHost

如果 urlexample.com/xyz12345.htm查看xyzredirects.dbmelse 退出到 VirtualHost

如果网址example.com/abc12345.htm不要查看xyzredirects.dbm

如果网址example.com/xyz12345.htm不要查看abcredirects.dbm

如果 urlexample.com/hik12345.htm不要查看xyzredirects.dbm或abcredirects.dbm

NO .htaccess 不幸的是我不能使用 .htaccess

Apache If 语句不起作用

apache-2.4
  • 1 1 个回答
  • 1611 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2018-11-22T11:27:49+08:002018-11-22T11:27:49+08:00

    我认为延迟不在RewriteMap定义中,只是在第一次调用查找时。所以RewriteMaps 可以在配置的顶部定义。

    似乎不需要使用<If>条件,因为您可以(并且应该)检查RewriteRule pattern中的 URL-path 。

    在 vHost 中尝试以下操作:

    RewriteEngine On
    
    RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
    RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
    
    RewriteCond ${abcredirects:$1} !=""
    RewriteRule ^(/abc.*) /${abcredirects:$1} [R=301,L]
    
    RewriteCond ${xyzredirects:$1} !=""
    RewriteRule ^(/xyz.*) /${xyzredirects:$1} [R=301,L]
    

    不需要<IfModule>容器(除非您的网站打算在没有 mod_rewrite 的情况下工作 - 但情况可能并非如此)。

    首先处理RewriteRule 图案。如果失败,则跳过前面的条件(查找重写映射)并继续处理下一个RewriteRule。

    如果/abc12345.htm字面上由数字组成,后跟.htm扩展名,则将其包含在RewriteRule 正则表达式中以尽可能具体并防止不必要的查找。例如:

    RewriteRule ^(/xyz\d+\.htm)$ /${xyzredirects:$1} [R=301,L]
    

    测试前请确保您的浏览器缓存已清除。出于这个原因,使用 302(临时)重定向通常更容易测试。


    但是,如果这一切都发生在新网站/服务器上,那么上述方法可能不是最好的方法,因为它会影响每个请求,包括对新页面和静态资源的所有请求。

    对于这么多 URL,当您的站点已经确定它是 404 时,通常最好编写重定向脚本。只有在请求的这个后期阶段,您才应该在站点的数据库中查找新 URL 并触发重定向。这样它就不会影响“正常”的网站性能。


    更新:

    abc url 可以是几种不同的方式,example.com/dir/dir/abc12345.htm或example.com/abc12345.htm或example.com/dir/dir/abc12345.xml,example.com/dir/abc12345.xml。URL 中唯一的常量是abc.

    在这种情况下,将RewriteRule 模式从更改为^(/abc.*):

    RewriteRule (.*/abc.+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
    

    如上所述,如果文件基名的其余部分(在文件扩展名之前)总是由数字(0-9)组成,那么更具体,匹配\d而不是.. 或者,如果总是有 5 位数字(如您的示例中所示),则\d{5}.

    请注意,上面捕获了匹配的整个 URL 路径(例如。/dir/dir/abc12345.htm),然后将其作为参数传递给您的重写映射。

    RewriteRule (.*/abc\d+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
    
    • 0

相关问题

  • Apache2 - SSL 不工作

  • Apache <VirtualHost> 标签,如果客户端的 IP = x 则不重定向... 怎么做?

  • 我无法启用我的网站?[关闭]

  • SELinux 阻止 Apache 写入文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve