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]