Принудительная косая черта в конце. Накладные расходы на обработку?

Я хочу, чтобы косые черты в конце были в папках, а не в файлах. Мне нужен способ избежать возможных дубликатов.

Я нашел этот ответ: Htaccess: добавить / удалить завершающую косую черту из URL-адреса

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]

Я пробовал в своем .htaccess, и, похоже, он работает хорошо

Но в документации Apache я обнаружил, что подобный код может вызвать «накладные расходы на обработку».

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

Не знаю, понимаю ли я это возражение. Это применимо и к этому коду? Является ли хорошей практикой помещать это в .htaccess, чтобы заставить правую конечную косую черту, когда это необходимо? Если нет, то как лучше всего это сделать?


person Nrc    schedule 17.05.2017    source источник


Ответы (1)


Я пробовал в своем .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
comment
очень хорошо объясненный ответ ++ - person anubhava; 17.05.2017
comment
Спасибо за ответ. Я обновил свой вопрос. Похоже, код мне не нужен. Можете ли вы предложить лучший способ принудительно использовать косую черту в конце для папок и не в конце для файлов. Ищу способ избежать возможных дубликатов - person Nrc; 18.05.2017