Назад | Перейти на главную страницу

mod_rewrite удаление завершающей косой черты вызывает циклы

У меня есть сайт, использующий mod_rewrite для создания красивых URL-адресов ... везде, где я читал, удаление завершающей косой черты хорошо для SEO, поэтому я придерживался правила:

RewriteRule ^(.+)/$ /$1 [R=301,L]

Я думаю, что 301 редирект может повлиять на производительность, но это не мой вопрос ...

Дело в том, что удаление завершающей косой черты вызывает у меня цикл, когда я пытаюсь получить доступ к index.php существующего подкаталога, например: http://mysite.com/a-real/directory/

Насколько я понимаю, mod_rewrite пытается удалить завершающую косую черту, но в данном случае этого не предполагалось.

Как я могу это исправить? Держу пари, что это довольно простое решение, но мне неизвестно.

Вам, вероятно, следует посмотреть документацию для mod_dir

Редирект "завершающая косая черта" выдается, когда сервер получает запрос на URL. http://servername/foo/dirname где dirname - это каталог. Для каталогов требуется косая черта в конце, поэтому mod_dir перенаправляет на http://servername/foo/dirname/.

Этот модуль, вероятно, снова добавляет косую черту после того, как вы ее удалили и т.д. и т.д. Вы можете отключить это поведение с помощью DirectorySlash директива.

Самым простым решением, вероятно, будет указание .htaccess не перенаправлять, если файл или каталог существует.

Добавьте в условие следующие две строки, чтобы предотвратить это.

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

(Вы также можете добавить -l, если используете каталоги / файлы с символическими ссылками)

Кроме того, как вы предлагаете, отбросьте 301, так что ваш полный доступ к htaccess будет:

Options +FollowSymLinks
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+)/$ /$1 [L]