很抱歉让每个人都遇到另一个mod_rewrite问题,但你知道这个问题。
基本上,我有viewer.php
,它接受两个参数,章节和页面。有时候人们只会要求章节,有时他们会要求章节和页面。即viewer.php?chapter=10
或viewer.php?chapter=10&page=5
。 php非常智能,可以为没有指定页面的用户显示第一页,而且我不关心请求viewer.php?page=3&chapter=50
的用户,没有人会这样做。
我想将viewer.php隐藏起来,并将格式c5/p3.html
和c5
设为规范。即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`
这适用于c1
,c14/p3.html
和c14/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请求,而不会导致无限循环。
非常感谢帮助。
答案 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