0

我正在编写我的第一个 htaccess,并希望帮助清理它并理解它。我遇到的第一个问题是多个参数。我当前的设置如下:

Options +FollowSymLinks

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/
RewriteRule ^([^/]*)$ index.php?p1=$1 [L]

RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/
RewriteRule ^([^/]*)/([^/]*)$ index.php?p1=$1&p2=$2 [L]

RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?p1=$1&p2=$2&p3=$3 [L]

RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L]

有没有办法简化它以处理最多 4 个参数,所有参数都是可选的?这让我想到了下一个问题,如果你需要在参数后面加上斜杠,除非你使用所有 4 个参数。

简而言之,我希望我的网址看起来像这样......

http://www.example.com/home
http://www.example.com/home/
http://www.example.com/blog/i-am-a-title
http://www.example.com/blog/i-am-a-title/
http://www.example.com/varable1/varable2/varable3/varable4
http://www.example.com/varable1/varable2/varable3/varable4/

我会很感激你能提供的任何帮助。

4

2 回答 2

3

嗯,这是一个实验,它会像你所说的那样工作,但我相信可能有更好的方法来做到这一点:

RewriteCond %{REQUEST_FILENAME} !/(index\.php|_modules|css|files|ico|img|js)/
RewriteRule ^(([^/]*)/?)(([^/]*)/?)(([^/]*)/?)(([^/]*)/?)$ /index.php?p1=$2&p2=$4&p3=$6&p4=$8 [L]

基本上我为每个条目添加了一个额外的组,这样您就可以安全地排除一个不存在的组。

所以第一个元素是必需的$2,第二个元素变成$4了,第三个元素变成$6了,最后一个元素变成了$8

(([^/]*)/?)这基本上意味着对于外部组和内部组来说,任何不是 a/结束或不以a 结尾的东西。//

进一步简化了规则:

RewriteCond %{REQUEST_FILENAME} !/(index\.php|_modules|css|files|ico|img|js)/
RewriteRule ^([^/]*|)/?([^/]*|)/?([^/]*|)/?([^/]*|) /index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L]
于 2013-08-19T19:08:30.670 回答
1

只要您不介意会有空白参数,您可以对所有参数使用前瞻:

RewriteCond %{REQUEST_FILENAME} !/(index\.php|_modules|css|files|ico|img|js)
RewriteRule ^(?:([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|) index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L]

这些是可选的问题是你的规则将循环一次,这使得第一个捕获组index.php。为避免这种情况,您需要index.php在条件中添加作为排除的一部分。

于 2013-08-19T19:15:05.997 回答