RewriteRule проверяет файл в переписанном пути к файлу - PullRequest
14 голосов
/ 23 января 2009

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

Ответы [ 2 ]

17 голосов
/ 23 января 2009
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 во что-то другое (и обновить также последнее правило перезаписи) чтобы избежать конфликта MultiViews.

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

5 голосов
/ 23 января 2009

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

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

RewriteRule ^pages/([^/\.]+)$ pages.php?p=$1 [L,QSA]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...