несколько правил доступа ht в одном файле

1

Мой сайт должен попытаться обслуживать все запросы из подкаталога кеша (/app/storage/cache), чтобы запрос /two.html был отправлен из /app/storage/cache/two.html

Дополнительные примеры:/из /app/storage/cache/index.html/two.html из /app/storage/cache/two.html/папки из /app/storage/cache/folder/index.html

Если файлы/каталоги не найдены, он должен обрабатывать все запросы с помощью php файла /app/router.php

Что я пробовал:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /app/storage/www/$1 [L]
RewriteRule ^(/)?$ /app/storage/www/$1 [L]

что отлично подходит для поиска всех URL-адресов и предоставления правильного ресурса без изменения URL-адреса. Теперь поймать все остальное:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . app/router.php [L]

Это также работает, но тогда первый набор условий больше не работает...

  • 0
    Есть ли причина, по которой router.php не может проверить, есть ли уже файл в кеше? Это, безусловно, возможно сделать с помощью .htaccess, но обычно разумно обновлять кэш время от времени, даже если вы думаете, что ничего не изменилось. Подумайте о ситуации, когда неполный файл был записан в кэш, или ресурс был недоступен, а неправильная вещь была кэширована. При использовании подхода .htaccess такой кэшированный файл останется ... навсегда. Через router.php вы можете время от времени принудительно заменять кеш.
  • 0
    @ Sumurai8 Да, потому что я хочу, чтобы сайт обслуживался статически для увеличения скорости. Маршрутизатор просто перехватывает административные маршруты для редактирования сайта CMS, который затем записывает в кеш. «Кэш» в данном случае является неправильным, так как сайт всегда обслуживается оттуда, а динамическая часть сайта (php) действует как генератор сайтов. Если бы вы могли поделиться тем, как добиться того, чего я хочу, с помощью .htaccess, это было бы оценено :)
Теги:
.htaccess
url-routing

1 ответ

1
Лучший ответ

Есть три способа, которыми я могу думать о том, как это сделать. Один из них проверяет кеш через router.php, прежде чем генерировать страницу через этот же файл. Другие два способа включают некоторую переписывающую магию.

Я не тестировал ни одно из них.

Падающий подход

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /app/storage/www/$1

#From this point on, the file/dir either exists or
#%{REQUEST_FILENAME} is now /app/storage/www/something
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/storage/www/ /app/router.php [L]

Явный тест

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/app/storage/www/$1 !-f
RewriteCond %{DOCUMENT_ROOT}/app/storage/www/$1 !-d
RewriteRule ^(.*)$ /app/router.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /app/storage/www/$1 [L]

Оба подхода могут быть ускорены с помощью основного файла конфигурации Apache (httpd.conf) вместо файла.htaccess, так как ему не нужно искать/читать файл.htaccess по каждому запросу.

  • 0
    Статические запросы в порядке (из / app / storage / www), но другие запросы не идут в /app/router.php, есть идеи? (это был провальный подход, явный тест обрабатывает все маршрутизатором ...)
  • 0
    Я не уверен, почему первый не работает; Мне нужно было это проверить, но я не могу хотя бы некоторое время. Во втором случае я допустил глупую ошибку (я совпал с ^ , но в условии использовал $1 Изменение соответствующей части на ^(.*)$ Должно исправить это. Возможно, вам понадобится повернуть информацию о пути при AcceptPathInfo Off .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню