RewriteRule проверяет файл в rewriten пути к файлу
Как вы можете использовать ModRewrite, чтобы проверить, существует ли файл кэша, и если это так, перепишите в файл кэша и в противном случае перепишите в динамический файл.
Например, у меня есть следующая структура папок:
pages.php
cache/
pages/
1.html
2.html
textToo.html
etc.
Как бы вы настроили RewriteRules для этого, так что запрос можно отправить следующим образом:
example.com/pages/1
И если файл кэша существует, перепишите его в файл кеша, и если файл кэша не существует, перепишите на pages.php? p = 1
Это должно быть примерно так: (обратите внимание, что это не работает, иначе я бы не спросил об этом)
RewriteRule ^pages/([^/\.]+) cache/pages/$1.html [NC,QSA]
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule cache/pages/([^/\.]+).html pages.php?p=$1 [NC,QSA,L]
Я не могу грубо сделать это с помощью PHP, но я думал, что это должно быть возможно с помощью mod_rewrite.
Ответы
Ответ 1
RewriteRule ^pages/([^/\.]+) cache/pages/$1.html [NC,QSA]
# At this point, we would have already re-written pages/4 to cache/pages/4.html
RewriteCond %{REQUEST_FILENAME} !-f
# If the above RewriteCond succeeded, we don't have a cache, so rewrite to
# the pages.php URI, otherwise we fall off the end and go with the
# cache/pages/4.html
RewriteRule ^cache/pages/([^/\.]+).html pages.php?p=$1 [NC,QSA,L]
Отключение MultiViews имеет решающее значение (если вы также включили).
Options -MultiViews
В противном случае начальный запрос (/pages/...) автоматически преобразуется в файл /pages.php до того, как будет введено mod_rewrite. Вы также можете просто переименовать page.php в другое (и обновить последнее правило перезаписи) чтобы избежать конфликта MultiViews.
Изменить: я первоначально включил RewriteCond ... !-d
, но он посторонний.
Ответ 2
Другим подходом было бы сначала посмотреть, есть ли доступное представление:
RewriteCond %{DOCUMENT_ROOT}/cache/$0 -f
RewriteRule ^pages/[^/\.]+$ cache/$0.html [L,QSA]
RewriteRule ^pages/([^/\.]+)$ pages.php?p=$1 [L,QSA]