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

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

我有四种不同类型的重写,每种类型都尝试使用多个参数。

首先,没有修改的 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/

接下来,我想在浏览器中输入以下内容:

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]

然而,其他一切都完全被我搞糊涂了。我觉得自己已经接近成功了,但这非常令人沮丧,因为我不知道有什么方法可以缩小问题范围。要么有效,要么无效。提前致谢。

答案1

如下所示:(请注意,这将删除pn变量尾部的“/”)

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 文件:

<html><head><title>Testing</title></head><body><pre><?php

var_dump($_GET);

echo "\r\n";

var_dump($_SERVER);

?></pre></body></html>

更新:如果您计划使用变量类别名称,并且不能保证字符/可以用作分隔符,则应该考虑在应用程序内部处理 URI 解析。

重写指令示例:

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;
  }
?>

相关内容