使用mod_rewrite帮助使用正则表达式

时间:2009-06-26 20:48:45

标签: regex mod-rewrite

我有这样的链接,我想改变:

mypage.com?page=missions&id=5
mypage.com?page=hello

我尝试将它们更改为更简单的链接:

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)$ /index.php?page=$1&id=$2 [L]

它有效,但如果我想访问像(mypage.com?page=hello)这样的页面,我必须写:

mypage.com/hello/

如果我这样写没有斜线,那么

mypage.com/hello

它不起作用。

我该如何解决? :)

3 个答案:

答案 0 :(得分:3)

这应该有效:

RewriteRule ^([^/]*)(/([^/]*))?$ /index.php?page=$1&id=$3 [L]

这将使斜杠成为可选项,方法是将其包含在可选组(由(...)?表示)中,以及查询字符串的可选后半部分。由于这会在第一个和第二个之间引入一个新组(左括号确定顺序),我们必须将第二个反向引用从$2更改为$3

如果逻辑变得比这复杂得多,分割规则可能更容易。

答案 1 :(得分:1)

您可以添加第二个规则,省略第二个参数,也可以选择省略斜杠:

RewriteRule ^([^/]+)/?$ /index.php?page=$1
RewriteRule ^([^/]+)/(\d+)/?$ /index.php?page=$1&id=$2

这也可能有效:

RewriteRule ^([^/]+)(?:/(\d+))?/?$ /index.php?page=$1&id=$2

对于SEO,您可能希望将缺少斜杠的请求重定向到带有斜杠的同一地址。使用RedirectMatch。

答案 2 :(得分:0)

我读到了关于SEO的尾随斜线(不知道它,谢谢mathew!),最终的结果是:

RewriteRule ^([a-zA-Z0-9_-]+)/$ /index.php?page=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ /index.php?page=$1&id=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ http://www.mypage.com/$1/ [R=301,L]

所以现在我强迫它有一个尾随斜杠。