Apache - 使用mod_rewrite对URL进行整理,同时捕获一些边缘情况

时间:2009-10-27 10:17:15

标签: apache mod-rewrite

很抱歉让每个人都遇到另一个mod_rewrite问题,但你知道这个问题。

基本上,我有viewer.php,它接受​​两个参数,章节和页面。有时候人们只会要求章节,有时他们会要求章节和页面。即viewer.php?chapter=10viewer.php?chapter=10&page=5。 php非常智能,可以为没有指定页面的用户显示第一页,而且我不关心请求viewer.php?page=3&chapter=50的用户,没有人会这样做。

我想将viewer.php隐藏起来,并将格式c5/p3.htmlc5设为规范。即example.com/c5/p3.html显示example.com/viewer.php?chapter=5&page=3的结果,example.com/c5显示example.com/viewer.php?chapter=5的结果。如果我能,我也想抓住那些忘记.html的人,即example.com/c14/p3。在所有这些情况下,我希望他们的地址栏URL可以更改,并为他们提供适当的viewer.php内容。

这是我目前的尝试,但它有问题。

## PRETTIFY URLS
# We'll help those who screw it up and forget the .html (i.e. /c12/p3), but..
RewriteRule c([0-9\.]+)/p([0-9]+)?$ /c$1/p$2.html [R=Permanent,NC]
# (this is a vestige of when I thought I wanted /p1.html appended for those who didn't specify a page, changed my mind now)
RewriteRule c([0-9\.]+)(/)?$ /c$1/p1.html [R=Permanent,NC]
# The canonical form is /c12/p3.html and that's that.
RewriteRule c([0-9\.]+)/p([0-9]+).html?$ /viewer.php?chapter=$1&page=$2`

这适用于c1c14/p3.htmlc14/p3。但是:凭借第二个RewriteRule(我无法弄清楚如何在没有Apache显示链接到自身的“永久移动”错误页面的情况下删除)它将c5/转换为c5/p1.html当我'相反,它只是删除尾部斜杠并成为c5。如果用户请求c5/p4/而不是知道他们的意思并将其转换为c5/p4.html,它也会抛出404。

作为一个额外的问题,我在某个地方使用method="get"向viewer.php提交章节,在这种情况下,在结果URL中向他们显示基础view.php?chapter=5结构,所以也许我应该添加一条规则来抓取对viewer.php的直接请求,并以某种方式将它们置于更新的样式中。

那么,有人可以帮我这个吗?我希望我能够清楚地知道自己想要什么。在我看来,如果修改我现有的代码,我需要更好地处理尾部斜杠,并以某种方式清除c5样式中的viewer.php请求,而不会导致无限循环。

非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

请尝试以下规则:

RewriteRule ^c([0-9]+)/p([0-9]+)/?$ /c$1/p$2.html [R=Permanent,NC]
RewriteRule ^c([0-9]+)/?$ /c$1/p1.html [R=Permanent,NC]
RewriteRule ^c([0-9]+)/p([0-9]+)\.html$ viewer.php?chapter=$1&page=$2