我正在尝试将此http://example.com/page.php?user=x&post=x
的网址转换为
http://example.com/blogs/user/post
这是我到目前为止的代码,不确定我是否遗漏了某些内容或做错了什么,因为到目前为止还没有成功。
RewriteEngine On
RewriteRule ^blogs/([a-z0-9\-]+)/([0-9]{1,11})/$ page.php?user=$1&post=$2 [L]
编辑:经过一些修改后,现在返回错误404错误,说找不到page.php
。我知道文件确实存在。
2ND编辑:已解决404问题。
post
参数也是可选的。
user
可以混合使用A-z0-9(无字符限制)
post
只能是0-9,最多11个字符
答案 0 :(得分:1)
根据http://htaccess.madewithlove.be/,这应该有效:
RewriteEngine On
RewriteRule ^blogs/([a-z0-9-]+)/([0-9]+)$ /page.php?user=$1&post=$2 [L]
这会将http://example.com/blogs/abc_123/67890
转换为http://example.com/page.php?user=abc_123&post=67890
。
最值得注意的变化是,您显然在规则的第一个组件中没有前导/
,但我也删除了帖子ID上的{11}
约束,因为它不太可能有预期的效果。
答案 1 :(得分:0)
尝试
RewriteRule ^blogs/?([a-z0-9]*)?/?$ page.php?user=$1&post=$2 [NC,L]
?
表示匹配是可选的。因此,对于/?
,斜杠是可选的。
对于^blogs/?
([a-z0-9]*)?
如果您从上面删除?
和*
,就会变成这样:
RewriteRule ^blogs/?([a-z0-9])/?$ page.php?user=$1&post=$2 [NC,L]
user
将不再是可选的,必须完全匹配。
示例http://blogs/John
;
如果您将+
代替*,如下所示:
RewriteRule ^blogs/?([a-z0-9]+)/?$ page.php?user=$1&post=$2 [NC,L]
user
需要与至少1个字符匹配。例如:http://blogs/J
如果你把*
星号放在下面:
RewriteRule ^blogs/?([a-z0-9]*)/?$ page.php?user=$1&post=$2 [NC,L]
它可以匹配零长度。例如:http://blogs/
。几乎像可选。
如果匹配失败,您将获得404 Not found error
答案 2 :(得分:0)
此代码提供了所需的结果......
RewriteRule ^blogs/([a-z0-9]+)?/?$ page.php?user=$1 [NC,L]
RewriteRule ^blogs/([a-z0-9]+)?/?([0-9]+)?/?$ page.php?user=$1&post=$2 [NC,L]
我还修改了帖子ID约束,正如Fraxtil指出的那样。