1

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

例如,

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
)
4

1 回答 1

2

查询字符串不能在RewriteRule. 您必须RwwriteCond改用:

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

这里:

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

您的 PHP 脚本将获得:

$_GET["url"]  : search
$_GET["tag"]  : Array([key_name] => mars)
$_GET["type"] : tag
于 2013-02-23T18:21:52.507 回答