Удалить косую черту с помощью mod_rewrite - PullRequest
2 голосов
/ 12 октября 2010

Я пробовал каждый пример, который мог найти, все они выдают внутреннюю ошибку сервера.У меня есть эти правила (это работает, без ошибок):

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule ^((/?[^/]+)+)/?$ ?q=$1 [L]

Так что, если это не существующий файл или существующий каталог с index.php, мы перенаправляем.Например, http://domain.com/foo/bar становится http://domain.com/?q=foo/bar

Дело в том, что я хочу удалить косую черту.Так что снимите /? в конце правила.Как сделать так, чтобы http://domain.com/foo/bar/ становилось http://domain.com/foo/bar с видимым перенаправлением сначала (исправление URL-адреса клиента) и только , а затем реальное тихое перенаправление на ?q=?

Везде, куда я смотрю, я вижу это:

RewriteRule (.*)/$ $1 [R,L]

Но это дает мне ошибку 500, если я вставлю ее перед моим правилом.

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

Если foo / bar существует как реальный каталог, то сервер будет перенаправлять клиента на foo / bar / (с завершающим слешем). Это необходимо для правильной работы относительных URL-адресов на клиенте. Если вы добавите правило, которое переписывает это обратно в foo / bar с перенаправлением, тогда будет цикл. Простой способ проверить, происходит ли это, - указать путь, которого вообще не существует (я предполагаю, что по вашему обнаружению index.php дерево каталогов действительно существует). Несуществующий путь не вызовет встроенное перенаправление.

Если я установлю набор правил, аналогичный вашему (плюс предлагаемое правило удаления косой черты), я смогу увидеть разницу между каталогом, который существует, и каталогом, который не существует. Те, которые не работают должным образом, те, которые заставляют Firefox сказать Эта страница неправильно перенаправляет . IE8 говорит что-то подобное. Возможно, используемая вами установка Apache может обнаружить ее и превратить в ошибку 500?

0 голосов
/ 10 января 2014

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

#prevent mod_dir from adding slash
DirectorySlash Off

#redirect /folder/ to /folder
RewriteCond %{THE_REQUEST} ^GET\s\S+/(\?\S+)?\s [NC]
RewriteRule ^(.*)/$ /$1 [R=301,L,QSA]

#internal redirect for directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ /$1/ [L]
0 голосов
/ 13 октября 2010

Попробуйте это правило перед вашим текущим правилом:

RewriteRule (.*)/$ /$1 [R,L]
0 голосов
/ 12 октября 2010

Похоже, должно работать более простое правило перезаписи, которое вы упомянули в конце вашего вопроса. Проблема в том, что ошибка 500 не очень помогает понять, почему она не работает. Один способ, который я нашел полезным для отладки ошибок mod_rewrite, - это включить его регистрацию. Добавьте следующее в ваш httpd.conf:

  RewriteLog "/usr/local/var/apache/logs/rewrite.log" 
  RewriteLogLevel 3 

Тогда попробуйте еще раз и посмотрите в журнале, чтобы увидеть, что происходит. Как только вы закончите, вы можете отключить журнал, установив rewriteloglevel 0. Подробнее см. mod_rewrite docs .

...