【问题标题】:Is it okay to have a very long .htaccess file?有一个很长的 .htaccess 文件可以吗?
【发布时间】:2011-05-25 01:02:46
【问题描述】:

我向网站上的人提供 URL,实际上指向丑陋的东西(在同一个网站上)。

http://www.mydomain.com/cool-URL
实际上指向
http://www.mydomain.com/boring.php?id=478547&sessid=34734asdf7&otherboringdetails

我计划通过在需要时修改 .htaccess 文件来实现这一点。我将让 PHP 脚本写入 .htaccess 文件,每当有新的 url 分发时添加新的重写规则(从管理区域,非程序员可以控制 [为此指定 URL 标题新条目,管理员:它将被自动分配])。

这是否会成为一个问题,尤其是在 1000 个左右这样的 URL 之后?可以接受的实际数字是多少?因为,我可以想象一下:服务器收到一个 URL 请求,然后它在 .htaccess 文件中搜索该 url 的正确页面,最后将用户发送到正确的页面。如果这类似于数据库搜索,用户可能需要很长时间才能真正到达正确的页面...

请指教一下?

【问题讨论】:

    标签: php performance .htaccess mod-rewrite


    【解决方案1】:

    不,这不行,会影响您的页面加载速度。

    .htaccess 文件在每个服务器请求上进行评估。即使是静态图像、CSS 和 JS 文件。因此,您要求网络服务器在执行请求时解析 1000 多条可能的 REGEX 行。

    此外,父目录的 .htaccess 文件也会针对位于子目录中的文件进行处理。因此,如果您的大 .htaccess 位于网站的根目录中,那么它也将针对对子目录中文件的所有请求进行处理(以及子目录中的 .htaccess 文件)。

    那我的朋友是很多处理的。如果您有一个包含 10 张图像的页面(例如),它将获得 11 次进程。文件中的处理越多,所需的周期就越多。所以是的,htaccess 文件中的任何内容都会产生影响。现在这种影响明显吗?当它成为一个问题时,很难说。但它必须相当大,因为处理相对简单,在你的情况下就是这样。

    htaccess 文件的关键是让它变得聪明。您不想列出 200 个条目。只需几行代码(如果你想使用 htaccess),你就可以让它变得聪明。

    【讨论】:

    • 好的,我将研究为我的问题制作正确的正则表达式。感谢您的澄清:)
    【解决方案2】:

    正如这里的一些人提到的那样,这绝对不行。

    您是否事先知道要重写的所有 URL。如果是这样,您可以将规则存储在某个数据库中,遍历规则并预先生成实际的 URL,并将它们存储在 memcache 中,其中 key 是好看的 URL, value 是内容的实际 URL。

    然后当请求到来时,在 memcache 中查找 key,并将用户重定向到真实的 URL。我什至认为您不需要 .htaccess 。

    【讨论】:

      【解决方案3】:

      有这么多的规则真的是不可取的。并不是说它们在 .htaccess 文件中,也不是针对每个请求对它们进行测试。 (根据配置,如果您将它们放入服务器或虚拟主机配置中,也可能会发生这种情况。)

      事实上,需要测试大量规则,并且根据规则,必须测试每条规则,直到找到匹配项。

      好吧,您可以通过按照匹配概率的顺序排列规则来抵消这种情况,以便尽早找到匹配的概率很高。但它的复杂度在最坏的情况下仍然是 O(n)。

      如果您确实需要那么多映射并且映射是固定的,您可以使用复杂度为 O(1) 而不是 O(n) 的 RewriteMap hash file 来分隔规则。或者您将映射转移到您的 PHP 应用程序并在那里进行。

      【讨论】:

        【解决方案4】:

        我将执行一个简单的测试:生成一个带有随机 URL 的大型 .htaccess 文件,然后自己测量生成的性能。

        import random,string
        
        def rand_string():
            length = random.randint(4,10)
            res = []
            for i in range(length):
                res.append(random.choice(string.letters))
            return ''.join(res)
        
        for i in range(1000):
            print "RewriteRule %s http://www.mydomain.com/boring.php?%s [R]" % \
             (rand_string(), rand_string())
        

        【讨论】:

          【解决方案5】:

          应该没问题。当它变得很长时,您可能会遇到服务器延迟。我会研究 mod_rewrite 规范,你也许可以用几行和正则表达式函数来自动化转发。我对将传递给您的示例的 url 变量了解不够。

          【讨论】:

            猜你喜欢
            • 2011-04-18
            • 1970-01-01
            • 2012-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多