如何用问号重写网址?

时间:2013-02-23 18:17:32

标签: php regex apache mod-rewrite query-string

是否可以重写带有问号的网址?

例如,

http://localhost/mysite/search?tag=mars

成为这个,

index.php?url=search&tag[key_name]=mars

我试过这个,但一点也不好,

RewriteRule ^search?tag=([a-zA-Z0-9\-]+)/?$  index.php?url=search&tag[key_name]=$1&type=tag [L,QSA]

有什么建议吗?

修改

%1

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]+)
RewriteRule ^search$ index.php?url=search&tag\%5Bkey_name\%5D=%1&type=tag [L]

结果,

print_r($_GET);

Array
(
    [url] => search
    [tag] => Array
        (
            [key_name] => 
        )

    [type] => tag
)

%0

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]+)
RewriteRule ^search$ index.php?url=search&tag\%5Bkey_name\%5D=%0&type=tag [L]

结果,

print_r($_GET);

Array
(
    [url] => search
    [tag] => Array
        (
            [key_name] => tag=mars
        )

    [type] => tag
)

1 个答案:

答案 0 :(得分:2)

RewriteRule内无法匹配查询字符串。您必须改为使用RwwriteCond

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]+)
RewriteRule ^search$ index.php?url=search&tag\%5Bkey_name\%5D=%1&type=tag [L]

下面:

  • []已被urlencoded为%5b%5D
  • \%用于转义文字%字符
  • %0 ... %9RewriteCond子句中匹配/捕获的字符串。这就是您对$0
  • 使用$9 ... RewriteRule的方式
  • QSA标志不是必需的
  • (^|&)匹配输入的开头(例如tag=mars&foo=bar}或&(例如foo=bar&tag=mars}
  • ?:使mod_rewrite 无法捕获此群组(其他此匹配将进入%1,下一个进入%2等)

您的PHP脚本将获得:

$_GET["url"]  : search
$_GET["tag"]  : Array([key_name] => mars)
$_GET["type"] : tag