更聪明的方式来编写递归重定向?

时间:2015-01-04 23:45:28

标签: regex apache mod-rewrite

我相信这是一个更好的方法来做到这一点,但不能真正弄明白。

有人可以告诉我是否有更好的方式来编写以下Apache .htaccess重写规则?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /index.php?param1=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)$ /index.php?param1=$1&param2=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /index.php?param1=$1&param2=$2&param3=$3 [L,QSA]

1 个答案:

答案 0 :(得分:0)

如果您只有3个路径段,那么您当前的代码似乎并不那么糟糕。您当前的规则很容易理解,我认为重复的条件!-f!-d不会对性能产生巨大影响。

您可以将当前规则重写为此类序列。首先,您将网址val1/val2/val3/val4/val5重写为index.php/val1/val2/val3/val4/val5。然后我们有一堆类似的规则,它们都采用第一个路径段并将其转换为参数。一旦不再有路径段,则忽略其余规则。

#Only on requests with at least 1 character (e.g. not to http://localhost)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php%{REQUEST_URI} [QSA]

#Since we don't have the L flag, this will do param1 - paramx in one go
RewriteRule ^index\.php/([^/]+)(/.*)?$ index.php$2?param1=$1 [QSA]
RewriteRule ^index\.php/([^/]+)(/.*)?$ index.php$2?param2=$1 [QSA]
RewriteRule ^index\.php/([^/]+)(/.*)?$ index.php$2?param3=$1 [QSA]
RewriteRule ^index\.php/([^/]+)(/.*)?$ index.php$2?param4=$1 [QSA]
RewriteRule ^index\.php/([^/]+)(/.*)?$ index.php$2?param5=$1 [QSA]

在使用它之前,您应该测试这些规则的性能和当前规则,以查看哪个规则表现更好。请注意,如果超过,在这种情况下,5个路径段在url中,这种方法会产生奇怪的结果,因为第6个到第n个路径段将覆盖param1 - param5。您可以通过在最新版本的Apache上添加另一个规则RewriteRule ^index\.php index.php [END]来“修复”此问题。