3

我有一个像

localhost/index?id=2

如何使用 htaccess 隐藏 id 部分并仅显示:

localhost/index/2
4

2 回答 2

4

为了捕获查询字符串,您需要使用%{QUERY_STRING}or %{THE_REQUEST}

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

# Redirect /index?id=2 to /index/2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\?id=([^&\s]+) [NC]
RewriteRule ^ /index?%1 [R=302,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]

鉴于您没有其他可能与您的需求冲突的规则,这应该可以正常工作。

一旦你确认它的工作,你可以从 , 更改为302301但为了避免缓存,测试应该总是使用302.

另一种使用%{THE_REQUEST}方式是这样的:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

# Redirect /index?id=2 to /index/2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\?id=([^&\s]+) [NC]
RewriteRule ^ /index/%1? [R=302,L]

# Internally forward /index/2 to /index.php?id=2
RewriteRule ^index/([0-9]+)/?$ /index.php?id=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
于 2013-09-21T21:15:46.583 回答
0
 RewriteEngine On
 RewriteRule    ^([A-Za-z0-9-+_%*?]+)/?$    index.php?id=$1     [L]

([A-Za-z0-9-+_%*?]+) <-- 括号中的这部分用作正则表达式意味着您正在寻找从 A 到 z 和从 a 到 z 的任何字符从 0 到 9 的数字和符号 - , +,_,%,*,? 右方括号后的 + 号表示多个 .

简而言之,您要的是 ([in here]+) 并且不止一个,但是如果您删除括号后的 + 符号,它将仅返回第一个字符

于 2013-09-21T21:05:48.553 回答