Dot-Htaccess

使用 .htaccess 用多個參數重寫 URL

  • May 26, 2021

我有四種不同類型的重寫,我試圖在每種重寫中使用多個參數。

首先,沒有修改的網址:

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]

然而,其他一切都完全逃脫了我。我覺得我很接近了,但這令人難以置信的沮喪,因為我不知道有什麼方法可以縮小問題的範圍。它要麼起作用,要麼不起作用。提前致謝。

給你:(請注意,這會去除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;
 }
?>

引用自:https://serverfault.com/questions/210734