我有这样的链接,我想改变:
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
它不起作用。
我该如何解决? :)
答案 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]
所以现在我强迫它有一个尾随斜杠。