mod_rewrite создает 301 вместо прозрачного перенаправления, если папка существует - PullRequest
0 голосов
/ 13 августа 2010

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

RewriteEngine On
RewriteCond $1 !^(templates|css|js|uploads)/(.*)$
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

В большинстве случаев перенаправление является хорошим и прозрачным. Но если папка, соответствующая URL-адресу, существует, и если я не поставлю последний «/», у меня будет перенаправление 301.

Примеры: (галерея папок не существует, но есть моды)

  • ht * p: // localhost / test / gallery / -> OK
  • ht * p: // localhost / test / mods / -> OK
  • ht p: // localhost / test / mods -> 301 перенаправление на ht p: // localhost / test / mods /? Url = mods

У меня есть эта проблема на всех серверах apache2 (проверено Fedora, Debian, Windows).

Кто-то знает, как это решить? Спасибо

1 Ответ

1 голос
/ 13 августа 2010

Это связано с директивой DirectorySlash, которая будет выполнять внешнее перенаправление после выполнения перезаписи, что приводит к непреднамеренным последствиям добавления добавленной строки запроса.

Вы можете отключить DirectorySlash, но это не рекомендуется по причинам, описанным в документации.Предпочтительным вариантом в этом случае, вероятно, является просто выполнение работы mod_dir для него, перенаправление на соответствующий URL с символом косой черты перед выполнением ваших правил.Что-то вроде этого над вашим существующим правилом должно работать:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^.*$ /$0/ [R=301,L]
...