Извините, что у всех возникла проблема с 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
. Он также выдает 404, если пользователь запрашивает c5/p4/
вместо того, чтобы знать, что он имел в виду, и преобразовывает его в c5/p4.html
.
В качестве дополнительной проблемы у меня где-то есть форма, которая использует method="get"
для отправки главы в viewer.php, и в этом случае базовая структура view.php?chapter=5
показывается им в результирующем URL, поэтому, возможно, мне следует добавьте правило, которое захватывает прямые запросы к viewer.php и как-то переводит их в новый стиль.
Так, кто-нибудь может мне помочь с этим? Надеюсь, я достаточно ясно понял, чего хочу. Мне кажется, что если я изменяю свой существующий код, мне нужно лучше обрабатывать завершающие слэши и каким-то образом очищать запросы на viewer.php в стиле c5
, не вызывая бесконечный цикл.
Помощь так высоко ценится.