使用动态URL在apache中重写URL

时间:2011-11-28 20:18:55

标签: apache mod-rewrite

我对这个mod_rewrite的东西很新,我正在尝试从新的应用程序中清理url。

我在网站上有两种类型的网址。它们始终是以下格式之一:

http://www.site.com/dreams.php?page=view&p=23
http://www.site.com/dreams.php?page=view&p=20
http://www.site.com/dreams.php?page=contact
http://www.site.com/dreams.php?page=contests

现在在我的主页面(dreams.php)中,我总是检查$ page是否设置为显示内容。 如何将我的网址发送给客户:

http://www.site.com/view/23
http://www.site.com/view/20
http://www.site.com/contact
http://www.site.com/contests

这些页面有一个例外,即用户在供应商页面上搜索内容时。

http://www.site.com/dreams.php?page=vendor_profile&pg=2&cat=&q=c&v_search=

我开始玩这个但是我得到了一些非常奇怪的结果。

Options +FollowSymLinks
RewriteEngine on
RewriteRule /(.*)/(.*)/$ /dreams.php?page=$1&p=$2

提前多多感谢。

3 个答案:

答案 0 :(得分:0)

这有助于你知道你得到了什么奇怪的结果。话虽如此,你应该为你的重写网址定义基础。在第一次重写指令之前添加RewriteBase /。

答案 1 :(得分:0)

表达式.*非常宽泛,也可以包含正斜杠,因此为了避免出现意外情况,我会根据您的情况缩小范围:

RewriteEngine On
RewriteBase /
RewriteRule ^([a-z]+)(?:/([\d]+)/?)?$ /dreams.php?page=$1&p=$2

那只会改写:

  1. 仅包含小写字符(a-z)的地址
  2. 一个以小写字母开头的地址,可选地后跟一个正斜杠和一个数字,最后还有一个正斜杠。
  3. 请注意,在表达式中,您需要至少有3个正斜杠才能匹配。

答案 2 :(得分:0)

尝试将RewriteRule更改为:

RewriteRule /([^/]+)/?$ /dreams.php?page=$1  [L,QSA]
RewriteRule /([^/]+)/([^/]+)/?$ /dreams.php?page=$1&p=$2  [L,QSA]

这样,查询字符串就会被追加,所以像这样的链接会起作用:http://www.site.com/vendor_profile?pg=2&cat=&q=c&v_search=