如何处理这种改变mod_rewrite规则?

时间:2013-04-08 08:12:57

标签: apache .htaccess mod-rewrite

我有一堆mod_write规则

RewriteRule ^connect$ connect.php
RewriteRule ^stuff$ stuff.php
RewriteRule ^logout$ logout.php

..等等。

在这个应用程序中,用户可以创建自己的页面并获得一个花哨的URL,例如:

www.url.com/customnamehere

如果我有一个rewrite_rule,它看起来像:

RewriteRule ^customenamehere$ page.php?name=customnamehere

但是,当然,我不打算为这些自定义页面中的每一个手动创建一个rewrite_rule,因为它们可能有很多......也许数千个,这将导致一个非常庞大且性能缓慢的htaccess文件。 / p>

这让我遇到了障碍:如何使它如果没有匹配的初始'固定'rewrite_rules,那么加载用户页面?我想也许我可以在开始时拥有所有常规规则,然后在所有其他规则结束时,例如:

RewriteRule ^(.*)$ page.php?name=$1

我错了。

你会怎么做?使用apach外部重写引擎的所有这些自定义名称的数据库,然后以某种方式包含在htaccess文件中(这对于大型db来说似乎很慢)?或者还有另一种方式吗?

1 个答案:

答案 0 :(得分:1)

您需要创建一个条件,以便在应用之前的规则之一时,不会应用路由到page.php的规则。您可以通过查看-f-d标志来执行此操作。您还应该在其他规则的末尾放置L个标记:

RewriteRule ^connect$ connect.php [L]
RewriteRule ^stuff$ stuff.php [L]
RewriteRule ^logout$ logout.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ page.php?source_url=$1

如果需要,您还可以在那里检查php,因为您可能不希望自定义名称以“.php”结尾:

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ page.php?source_url=$1

虽然-f-d检查可能是更好的方法。