用多个参数使用.htaccess重写URL

我一直在试图在过去的几个小时里创build一些重写规则,而且我失败了。 如果有人能帮忙,我会非常感激。

我有四个不同types的重写,我试图做与每个参数中的多个。

首先,没有修改的url:

http://www.example.com/index.php?p=/category/page-slug&pn=2/ http://www.example.com/index.php?p=/category/&f=feed/rss (feed, feed/, feed/rss, feed/atom are the only possible values for the f parameter) http://www.example.com/index.php?p=tag&t=tag-one+tag-two+-tag-three&pn=2/ http://www.example.com/index.php?p=search&q=search+query+goes+here&pn=2/ 

接下来,我希望能够在浏览器中input:

 http://www.example.com/category/page-slug/2/ http://www.example.com/category/feed/rss http://www.example.com/tags/tag-one+tag-two+-tag-three/2/ http://www.example.com/search/search+query+goes+here/2/ 

最后,我尝试了以及无数的变化:

 RewriteRule ^([a-zA-Z0-9-/+]+)([0-9]+)$ index.php?p=/$1&pn=$2/ [L] RewriteRule ^([a-zA-Z0-9-/+]+)([a-zA-Z/]+)$ index.php?p=/$1&f=$2/ [L] RewriteRule ^([a-zA-Z0-9-/+]+)([a-zA-Z/]+)([0-9]+)$ index.php?p=/$1&t=$2&pn=$3/ [L] RewriteRule ^([a-zA-Z0-9-/+]+)([a-zA-Z/]+)([0-9]+)$ index.php?p=/$1&q=$2&pn=$3/ [L] 

我能够使用以下方式处理p参数:

 RewriteRule ^([a-zA-Z0-9-/+]+)$ index.php?p=/$1 [L] 

但是,其他一切都完全逃脱了我。 我觉得我很接近,但是令人难以置信的是,我不知道有什么办法缩小问题的范围。 它可以工作,也可以不工作。 提前致谢。

这里你去:(注意,这剥离了尾随“/”的pnvariables)

 RewriteEngine on RewriteBase / RewriteRule ^category/(.*)/([0-9]+) index.php?p=/category/$1&pn=$2 [L] RewriteRule ^category/feed(.*) index.php?p=/category/&f=feed$1 [L] RewriteRule ^tags/(.*)/([0-9]+)/ index.php?p=$1&pn=$2 [L] RewriteRule ^search/(.*)/([0-9]+)/ index.php?p=search&q=$1&pn=$2 [L] 

…和一个PHP文件来简化testing:

 <html><head><title>Testing</title></head><body><pre><?php var_dump($_GET); echo "\r\n"; var_dump($_SERVER); ?></pre></body></html> 

更新:如果你打算拥有可变类别名称,并且你不能保证/字符将作为分隔符,你应该考虑在你的应用程序本身中处理URIparsing。

示例重写指令:

 RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* /index.php [L,QSA] 

示例PHP文件:

 <?php $uri = $_SERVER['REQUEST_URI']; $uri_array = explode( "/", $uri ); switch ( $uri_array[0] ) { case '': /* serve index page */ break; case 'feed': switch ( $uri_array[1] ) { case 'atom': /* serve atom feed */ break; case 'rss': /* serve RSS feed */ break; default: /* default feed behavior */ break; } break; case 'tags': $tags = ($uri_array[1]) ? $uri_array[1] : ''; $page_number = ($uri_array[2]) ? $uri_array[2] : 1; /* tag display behavior */ break; default: $category = ($uri_array[1]) ? $uri_array[1] : ''; $page_number = ($uri_array[2]) ? $uri_array[2] : 1; /* category lookup behavior + return 404 if category not found */ break; } ?>