使用.htaccess重写网址

时间:2014-03-23 02:54:31

标签: php .htaccess mod-rewrite

我正在尝试将此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个字符

3 个答案:

答案 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指出的那样。