mod_rewrite, где правило перезаписи соответствует каталогу

#apache #mod-rewrite #url-rewriting

#apache #mod-перезапись #url-перезапись

Вопрос:

У меня есть правило mod_rewrite, подобное этому:

 RewriteRule ^(alice)/?$ bob.php?page=$1 [L]
  

Если я перейду к http://localhost/alice /, оно гласит bob.php (как и ожидалось). Если я перейду к http://localhost/alice (без косой черты в конце), оно гласит bob.php (опять же, как и ожидалось).

Если я создам каталог в htdocs под названием «alice» и перейду к http://localhost/alice /, оно гласит bob.php. Но, если я перейду к http://localhost/alice теперь оно перенаправляет на http://localhost/alice/?page=alice . Оно по-прежнему читает bob.php (это то, что я хочу), но я бы предпочел, чтобы это не изменяло URL таким образом.

Почему это происходит, и есть ли какой-либо способ предотвратить это (кроме того, что просто нет таких каталогов, которые лежат)?

Комментарии:

1. @QuantumMechanic: Я рассматривал возможность публикации этого там в первую очередь, но у SO 3716 вопросов с тегом mod-rewrite, а у SF только 578. Конечно, популярность не делает что-то правильным, но, по моему опыту, правила перезаписи — это вопрос к программистам, а не к системным администраторам.

Ответ №1:

 RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(alice)/?$ bob.php?page=$1 [L]
  

Комментарии:

1. спасибо за ваш ответ. Однако я действительно хочу, чтобы localhost / alice отображал bob.php я просто не хочу, чтобы оно изменяло URL. Я отредактировал свой вопрос, чтобы прояснить это.

Ответ №2:

Похоже, это вызвано /? в конце — удаление ? причины (при существовании каталога alice):

  • /alice перенаправляется в /alice/ и отображается как /bob.php?страница=alice
  • /alice/ для отображения как /bob.php?страница=alice

Если каталог alice не существует, /alice не будет перенаправлен (но /alice/ будет). Если вы знаете, существует ли каталог или нет, вы можете выбрать, использовать ли / или /? .