Apache - предварительная обработка URL с помощью mod_rewrite, а также отслеживание некоторых крайних случаев - PullRequest
0 голосов
/ 27 октября 2009

Извините, что у всех возникла проблема с 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, не вызывая бесконечный цикл.

Помощь так высоко ценится.

1 Ответ

0 голосов
/ 29 октября 2009

Попробуйте эти правила:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...