Dot-Htaccess
使用 .htaccess 用多個參數重寫 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]
然而,其他一切都完全逃脫了我。我覺得我很接近了,但這令人難以置信的沮喪,因為我不知道有什麼方法可以縮小問題的範圍。它要麼起作用,要麼不起作用。提前致謝。
給你:(請注意,這會去除
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; } ?>