我相信这是一个更好的方法来做到这一点,但不能真正弄明白。
有人可以告诉我是否有更好的方式来编写以下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¶m2=$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /index.php?param1=$1¶m2=$2¶m3=$3 [L,QSA]
答案 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]
来“修复”此问题。