Nano Hash - криптовалюты, майнинг, программирование

Переписать проблему - L(ast) не уважают?

Итак, я работаю над системой сжатия CSS/JS для сайта, который в основном имеет следующий htaccess

RewriteEngine On

...

RewriteRule ^css/images/(.*)$ images/site/$1?%{QUERY_STRING} [L]
RewriteRule ^css/([0-9a-fA-F]{32})$ assets.php?hash=$1 [L]

RewriteCond %{HTTP_HOST} ^www.site.com [NC]
RewriteRule ^(.*)$ http://site.com/$1 [L,R=301]

RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]

php_flag register_globals off
php_flag magic_quotes_gpc off
php_flag register_long_arrays off

# 404 Handler
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING}

Прямо сейчас assets.php не получает хеш-вызов, а index.php - если я удалю строку RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]

он работает нормально, но я не знаю, почему - разве флаг [L] в активах не должен перезаписывать RewriteRule ^css/([0-9a-fA-F]{32})$ assets.php?hash=$1 [L], предотвращая выполнение любых дальнейших перезаписей? Я смущен тем, что здесь происходит.

Мы будем очень признательны за любой свет, который вы могли бы пролить на это.


Ответы:


1

Флаг L говорит «больше не выполнять правила в наборе правил», что, как ни странно, не означает, что mod_rewrite больше не будет выполнять никаких правил.

Когда вы указываете директивы mod_rewrite в контексте каждого каталога, например, в разделе .htaccess или Directory конфигурации сервера или виртуального сервера, перезапись происходит поздно на этапе обработки Apache. Чтобы сделать свое волшебство здесь, mod_rewrite должен выполнять внутреннюю переадресацию каждый раз, когда ваш URL-адрес перезаписывается.

Поскольку ваше переписывание может указать вам на другой каталог, mod_rewrite назначает себя обработчиком этого перенаправления, чтобы он мог использовать любые правила, которые он может найти в новом месте, куда вы отправили запрос. Часто, поскольку вы имеете дело только с одним файлом .htaccess в корневом каталоге, правила в «новом» местоположении оказываются теми, которые вызвали перезапись в первую очередь.

Итак, в вашем случае происходит следующее:

  • Запрос сделан для /css/A01EF
  • mod_rewrite запускает набор правил
  • ^css/([0-9a-fA-F]{32})$ -> assets.php?hash=A01EF
  • Флаг L останавливает перезапись и вызывает внутреннее перенаправление на assets.php?hash=A01EF
  • mod_rewrite снова запускает набор правил
  • ^([a-zA-Z0-9_.-]+)$ -> index.php?url=assets.php&hash=A01EF (кстати, здесь можно использовать QSA)
  • Флаг L останавливает перезапись и вызывает внутреннее перенаправление на index.php?url=assets.php&hash=A01EF

Вполне вероятно, что этот цикл будет продолжаться, но mod_rewrite распознает, что вы перенаправляете на ту же страницу, и игнорирует ваше изменение после этого момента.

Весь этот процесс происходит потому, что два условия...

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

...так распространены в .htaccess mod_rewrite наборах правил, учитывая, что они обеспечивают простой способ определить, был ли URL-адрес уже переписан на предполагаемый реальный ресурс. Вы можете использовать их или исключить переписывание index.php, когда запрос был переписан на assets.php:

RewriteCond %{REQUEST_URI} !^/assets.php
RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]
14.08.2010
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..