有一个很长的.htaccess文件可以吗?

时间:2010-12-14 02:57:55

标签: php performance .htaccess mod-rewrite

我正在向网站上的人发送网址,这实际上指的是丑陋的东西(在同一个网站上)。

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

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

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

请问有什么指示吗?

5 个答案:

答案 0 :(得分:19)

不,不行,会妨碍您的页面加载速度。

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

此外,还会为驻留在子目录中的文件处理父目录的.htaccess文件。因此,如果你的大型.htaccess位于网站的根目录中,那么它也将被处理为子目录中的文件所做的所有请求(以及子目录中的.htaccess文件)。

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

带有htaccess文件的密钥是为了让它变得聪明。您不希望列出200个条目。只需几行就可以这么聪明(如果你想使用htaccess)。

答案 1 :(得分:5)

我会执行一个简单的测试:生成一个包含随机网址的大型.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())

答案 2 :(得分:5)

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

这是一个事实,即大量的规则经过测试,并且根据规则,每个规则都必须经过测试,直到找到匹配为止。

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

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

答案 3 :(得分:1)

应该没问题。当它变得非常长时,您可能会遇到服务器延迟。我会研究一下mod_rewrite的规格,你可以通过几行和一些来自动化前进。正则表达式功能。我不太了解将传递的url变量给你一个例子。

答案 4 :(得分:1)

这绝对不行,因为这里有一些人提到过。

您是否知道您希望事先重写的所有网址。如果是这样,您可以将规则存储在某个数据库中,通过规则进行迭代并预生成实际数据 URLS,并将它们存储在memcache中,其中key是好看的URL,值是内容的实际URL。

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