Существует файл проверки RewriteRule в переписанном пути к файлу

Как вы можете использовать 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.


person Pim Jager    schedule 22.01.2009    source источник


Ответы (2)


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. Вы также можете просто переименовать pages.php во что-то другое (и также обновить последнее правило перезаписи), чтобы избежать Конфликт мультивидов.

Редактировать: я изначально включил RewriteCond ... !-d, но это постороннее.

person Sean Bright    schedule 23.01.2009

Другой подход заключается в том, чтобы сначала посмотреть, есть ли доступное представление chached:

RewriteCond %{DOCUMENT_ROOT}/cache/$0 -f
RewriteRule ^pages/[^/\.]+$ cache/$0.html [L,QSA]

RewriteRule ^pages/([^/\.]+)$ pages.php?p=$1 [L,QSA]
person Gumbo    schedule 23.01.2009