Apache ReWriteEngine выбрасывает 500 внутренних ошибок сервера для слишком большого количества внутренних перенаправлений ... почему? - PullRequest
1 голос
/ 14 января 2011

Я пытаюсь реализовать новое правило перезаписи на моей локальной машине разработчика. У меня уже настроено 13 правил, и все они работают нормально (даже на момент написания статьи). Тем не менее, по какой-то причине самый новый выдает мне 500 внутренних ошибок сервера.

Правило перезаписи:

RewriteRule stuff/public_html/vault/mystuff/view/(.*) /stuff/public_html/vault/mystuff/view/index.php?stuff=$1

RewriteRule stuff/public_html/vault/mystuff/view/(.*)/ /stuff/public_html/vault/mystuff/view/index.php?stuff=$1

Проверил мои логи apache и получил это:

[Thu Jan 13 22:07:43 2011] [error] [client ::1] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary., referer: http://localhost:8888/stuff/public_html/vault/mystuff/all/index.php?curr=7

В скрипте, который я пытаюсь перенаправить на view / index.php? Stuff = $ 1, нет ничего, что даже отдаленно напоминало бы перенаправление любого вида. У меня есть очень, очень простой верификатор сеанса, вызываемый в верхней части сценария посадки, который выглядит следующим образом:

//Start session
 session_start();

 //Check whether the session variable SESS_MEMBER_ID is present or not
 if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
  header("location: ".$root_http."");
  exit();
 }

Однако, когда я получаю доступ к странице напрямую, она работает как надо, и перенаправления не происходит. Все остальные мои правила ReWrite и соответствующие им целевые страницы настроены точно так же.

Это поражает меня. Любая помощь, пожалуйста!?

По предложению Марка Б я включил RewriteLog и придумал следующее:

:: 1 - - [13 / Jan / 2011: 23: 00: 09 --0500] [localhost / sid # 807df8] [rid # 941b38 / initial / redir # 10] (2) [per-dir / Пользователи / stepheng / Development /] переписывают вещи / public_html / vault / mystuff / view / index.php -> /stuff/public_html/vault/mystuff/view/index.php?stuff=index.php

:: 1 - - [13 / Jan / 2011: 23: 00: 09 --0500] [localhost / sid # 807df8] [rid # 941b38 / initial / redir # 10] (3) split uri = / stuff /public_html/vault/mystuff/view/index.php?stuff=index.php -> uri = / stuff / public_html / vault / mystuff / view / index.php, args = stuff = index.php

:: 1 - - [13 / Jan / 2011: 23: 00: 09 --0500] [localhost / sid # 807df8] [rid # 941b38 / initial / redir # 10] (3) [per-dir / Пользователи / stepheng / Development /] применяют шаблон 'stuff / public_html / vault / mystuff / view /(.*)/' к uri '/stuff/public_html/vault/mystuff/view/index.php'

:: 1 - - [13 / Jan / 2011: 23: 00: 09 --0500] [localhost / sid # 807df8] [rid # 941b38 / initial / redir # 10] (1) [per-dir / Users / stepheng / Development /] внутреннее перенаправление с /stuff/public_html/vault/mystuff/view/index.php [ВНУТРЕННЕЕ НАПРАВЛЕНИЕ]

Похоже, что он пытается отправить аргумент? Stuff = index.php, но я не понимаю, как это возможно. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Включите ведение журнала перезаписи:

 RewriteLog /path/to/rewritelog.file
 RewriteLogLevel 9

в вашем httpd.conf.Это в основном будет записывать ВСЕ, что делает механизм перезаписи, и вы сможете увидеть точный путь, по которому URL прошел через систему, и, скорее всего, почему он делает то, что выглядит как бесконечный цикл

2 голосов
/ 14 января 2011

Разве это правило перезаписи не соответствует его назначению?Это будет петля.Вам нужно добавить флаги, которые говорят, что в конце прекратить обработку правил перезаписи:

RewriteRule stuff/public_html/vault/mystuff/view/(.*)/ /stuff/public_html/vault/mystuff/view/index.php?stuff=$1 [L]

0 голосов
/ 14 января 2011

Я не уверен, что в запросе указан этот путь: /stuff/public_html/vault/mystuff/view - на что указывает корневой каталог вашего документа?

Не могли бы вы опубликовать свой полный apache?

Тем временем попробуйте это - он прекращает перенаправления, если система соответствует существующему файлу или каталогу, поэтому вы должны перенаправлять только один раз:

RewriteEngine on

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule stuff/public_html/vault/mystuff/view/(.*)/ /stuff/public_html/vault/mystuff/view/index.php?stuff=$1 [QSA,L]
...