是否可以通过查询将mod_rewrite动态网址添加到静态网址?

时间:2012-03-19 03:56:29

标签: .htaccess

这是我想要实现的目标:

之前:

  

www.example.com/index.php?page=about&pg=5

后:

  

www.example.com/about.html?pg=5

URL必须在最后具体包含该查询。我想避免使用这些静态方法: www.example.com/page/about/pg/5/ 要么 www.example.com/about/5 /

这是我到目前为止所拥有的:

RewriteEngine On
RewriteBase /

RewriteRule ^([a-zA-Z-]+)\.html\?pg\=([0-9]+)$ index.php?page=$1&pg=$2 [L]

当我var_dump($ _ GET);只有'页面'参数是可见的。

我希望结果好像我在地址栏中输入一样,www.example.com / about.html?pg = 5与输入www.example.com/index.php?page=about&pg的意思相同= 5。而不是使用.php我想它显示为.html。参数' pg'是我用作各种页面的超链接。我想删除" index.php'并将其设为' about.html',然后查询的其余部分。

例如,此页面将用于文章。该文章中将有一节评论。我想用参数' pg'来控制评论的页面。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要将about.html?...重写为index.php?page=about&...。如果是这样,有一个简单的解决方案:只需使用[QSA]标志。

RewriteRule ^([0-9A-Za-z]+)\.html$ index.php?page=$1 [NS,QSA]

更一般地说,您可以使用RewriteCond来匹配查询字符串中的文本。正如documentation所说:

  

“如果您希望与主机名,端口或查询字符串匹配,请分别使用RewriteCond%{HTTP_HOST}%{SERVER_PORT}变量。{”

例如,在没有%{QUERY_STRING}标志的情况下实现相同效果的另一种方法是:

[QSA]

或者,如果你想走另一条路(我第一次看到你的问题):

RewriteCond %{QUERY_STRING} ^pg=([0-9A-Za-z]+)$
RewriteRule ^([0-9A-Za-z]+)\.html$ index.php?page=$1&pg=%1 [NS]

(编辑:根据RewriteCond %{QUERY_STRING} ^page=([0-9A-Za-z]+)&pg=([0-9]+)$ RewriteRule ^index\.php$ %1.html?pg=%2 [NS] 的评论删除了错误的问号。)