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

Php 有一个很长的.htaccess文件可以吗?,php,performance,.htaccess,mod-rewrite,Php,Performance,.htaccess,Mod Rewrite,我在一个网站上给人们发网址,实际上是指向一些丑陋的东西(在同一个网站上) 实际上指向 我计划通过在需要时修改.htaccess文件来实现这一点。我将使PHP脚本写入.htaccess文件,每当url有新的内容时,添加一个新的重写规则(从非程序员可以控制的管理区域[指定此新条目的url标题,admin:它将自动分配]) 这是否会成为一个问题,特别是在1000个这样的URL之后?可接受的实际数字是多少?因为,我可以想象这样的情况:服务器收到一个URL请求,然后在.htaccess文件中搜索该UR

我在一个网站上给人们发网址,实际上是指向一些丑陋的东西(在同一个网站上)


实际上指向

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

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


有关于这方面的建议吗?

应该没问题。当服务器延迟变得很长时,您可能会遇到服务器延迟。我将研究mod_重写规范,您可能可以使用一些line®ex函数自动转发。我对将要传递的url变量了解不够,无法给您一个示例。

不,这不正常,会影响页面加载速度。

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

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

我的朋友是一个处理很多。例如,如果你有一个包含10个图像的页面,它会得到11次处理。文件中的处理越多,所需的周期就越多。是的,htaccess文件中的任何内容都会产生影响。现在,这种影响是否明显?很难说什么时候会成为问题。但它必须相当大,因为处理过程相对简单,在你的例子中就是这样


htaccess文件的关键是使其智能化。您不想列出200个条目。您只需几行就可以实现智能化(如果您想使用htaccess)。

我将执行一个简单的测试:生成一个包含随机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())

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

这仅仅是一个事实,大量的规则需要测试,根据规则的不同,每一条规则都需要测试,直到找到匹配项为止

嗯,你可以通过按匹配概率的顺序排列规则来抵消这一点,这样早期找到匹配的概率就高了。但在最坏的情况下,它的复杂性仍然是O(n)


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

正如这里的一些人所提到的,这肯定不好

你知道所有你想事先重写的网址吗。如果是这样,您可以将规则存储在某个数据库中,迭代规则并预生成实际的 URL,并将它们存储在memcache中,键是好看的URL,值是内容的实际URL


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

好的,我将研究如何为我的问题生成正确的正则表达式。感谢您的澄清:)