Я пробовал в своем .htaccess
и он очень хорошо работает
Вы уверены? (Может быть, это сработает в вашем конкретном случае ??) Но вы не должны использовать эти два блока правил вместе, они делают наоборот. Первое удаляет завершающую косую черту (для не-каталогов), а второе правило добавляет завершающую косую черту (для нефайловых).
Например, если вы сделали запрос для /foo/
, где /foo
не сопоставляется ни с каталогом, ни с файлом, вы получите цикл перенаправления. Завершающая косая черта удаляется, затем добавляется и т. Д. И т. Д.
что заставляет конечные косые черты в папках и не конечные косые черты в файлах
На самом деле, ни одно из этих правил не «не требует завершающих слэшей в папках». При условии, что у вас есть DirectorySlash On
(по умолчанию), тогда mod_dir заставляет конечную косую черту в каталогах (с перенаправлением 301).
может вызвать "накладные расходы на обработку"
накладные расходы на обработку - это проверка существования каталога и / или файла при каждом запросе (который соответствует RewriteRule
шаблону). Да, это накладные расходы, однако они считаются незначительными, поскольку накладные расходы идут. Большинство CMS используют похожую технику со своим фронт-контроллером, например:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Однако это можно оптимизировать. Вы можете включить исключение в начало файла для статических ресурсов, «которые выглядят как» (изображения, CSS, JS и т. Д.), И запретить проверку каталога / файла для этих запросов. Например:
RewriteRule .\.(jpe?g|png|gif|css|js)$ - [L]
Это просто проверяет любые запросы, которые заканчиваются этими расширениями файлов, и останавливает дальнейшую обработку, поэтому проверки каталогов / файлов для этих запросов не выполняются.
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]
В сторону: (На всякий случай, если это в вашем реальном коде.) Apache на самом деле не поддерживает комментарии в конце строки. В этом случае это «сработает», но будущие правки потенциально могут ужасно сломаться, поэтому лучше избегать. См. Мой ответ на этот другой вопрос: https://stackoverflow.com/a/31770372/369434
Я хочу, чтобы косые черты в конце были в папках, а не в файлах.
ОБНОВЛЕНИЕ: я предполагаю, что мы имеем дело только с физическими файлами и каталогами, никакие виртуальные URL-адреса не маршрутизируются с помощью фронт-контроллера и т. д.
В этом случае вам не нужно ничего делать, чтобы принудительно использовать завершающие слэши в каталогах (как упоминалось выше). Если DirectorySlash Off
не установлен, вы уже должны быть готовы к работе. Это позволяет mod_dir автоматически добавлять завершающую косую черту (через перенаправление 301) при запросе каталога, у которого нет конечной косой черты. (Второе опубликованное вами правило делает то же самое, но оно излишне, если mod_dir делает свое дело.)
Чтобы удалить завершающие косые черты из файлов, вам понадобится только первое правило из двух, которые вы опубликовали:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R,L]
Это удаляет завершающую косую черту, если она присутствует в запросе и не является запросом физического каталога. Дальше это сложно оптимизировать. Правило обрабатывается только в том случае, если в начале стоит косая черта в конце, поэтому количество перехваченных запросов должно быть минимальным. Однако важно, чтобы вы уже ссылались на канонический (без косой черты) URL-адрес в своем приложении.
Упомянутая выше оптимизация для исключения статических ресурсов не является обязательной. Если в вашем .htaccess
файле нет других директив mod_rewrite, то пользы от этого мало.
person
MrWhite
schedule
17.05.2017