mod_rewrite (?) и кеширование

uncle17

афаиу, элементарная вещь, просто сталкиваться не приходилось.
Натыкался на это где-то, но найти не могу. Помню, что очень просто делается.
Что прописать в .htaccess, чтобы, например:
при обращении к /index.html проверяется, есть ли он. Если есть, отдается он.
Если нет, запускается скрипт, допустим, generate?filename=index, который его генерит, а затем отдает.

slonishka

в nginx примерно так: http://wiki.codemongers.com/NginxHttpProxyModule#proxy_store
в апаче надо смотреть на постусловия RewriteRules, точно не помню, но во всех манах есть.

slonishka

RewriteCond %{REQUEST_FILENAME} !-F
RewriteRule ^.*$ /generate?%{REQUEST_FILENAME}

как-то так. наверняка штуки три синтаксических ошибки.
http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html#...

uncle17

Во. Точно так. Данке шон.
Не.. как-то не так... Потом помучаюсь...

slonishka

про [флаги] не забыл?

sbs-66

При этом generate должен этот файл создать сам, насколько я понимаю

uncle17

Может, и забыл...
Пока в них не силен. Сейчас стоит

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule index.html index.php [L]

2 : точно так. Он и создает, когда просто перенаправление выставить. Но при рефреше он его опять пересоздает - условие не получается написать

slonishka

Он и создает, когда просто перенаправление выставить. Но при рефреше он его опять пересоздает - условие не получается написать
эээ. при рефреше дергается свежесозданный index.html
При этом generate должен этот файл создать сам, насколько я понимаю
ну да, это ж классика. в мемкеш тоже бекенд кладет обычно.

sbs-66

ну да, это ж классика. в мемкеш тоже бекенд кладет обычно.
Я в том смысле, что в принципе веб-сервер может сам отдаваемый результат в файл класть. Думаю, если поставить nginx как прокси, то его можно подобным образом настроить. А в апаче с модреврайтом надо в скрипте результат и в вывод выдать, и в файл самому его записать.

uncle17

должен дергаться. Точнее, хочу этого добиться. Но вот как-то не очень

slonishka

Думаю, если поставить nginx как прокси, то его можно подобным образом настроить.
ага, по моей первой ссылке показано, как это сделать.
я просто апач давно не видел, уже не помню, как это делается там. =)

slonishka

давно бы уж ман прочитал. был бы у меня апач, прислал бы тебе лентяю готовое решение.
и вообще, как тут верно заметил, проксировать надо nginx-ом.
и настраивается он проще, потому что там говна не наворочено всякого.

uncle17

дык... у меня, боюсь, знаний для понятия этих манов не хватает. Твои ссылки, ессно, были прочитаны.
Ладно... Видимо, буду делать через жеппу. Это вообще не обязательно - там пока 100 человек в день ходит, но хотелось вот сделать

korsar0156

htaccess:
<Files ~ "^generate.php">
Order allow,deny
Deny from all
</Files>

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ generate.php?%{REQUEST_FILENAME}

generate.php:
<?
exec("echo test > {$_SERVER['QUERY_STRING']}");
passthru("cat {$_SERVER['QUERY_STRING']}");

должно работать

uncle17

могу еще один повод для смеха сказать: делается пока локально на виндовой машине :)

korsar0156

ну значит echo и cat меняем на put_file_contents и get_file_contents :-)

uncle17

до такого я и сам с самого начала додумался
Хотел, чтобы, если существует file.html, скрипт вааще не запускался

korsar0156

так он и не будет запускаться во второй и последующие разы.
просто в первый раз он должен создать файл и отдать его содержимое.

uncle17

ну да, точно.
Но такое вот действо, как ты написал, выдает 400
File does not exist: C:/path/index.html

korsar0156

может rewrite не работает?

uncle17

работает

uncle17

нет, все равно каждый раз скрипт стартует...

<Files ~ "^index.php">
    Order allow,deny
    Allow from all
</Files>

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*\.html$ "C:/path/index.php?%{REQUEST_FILENAME}"

kruzer25

И что будет при
GET /tmp%0d%0arm%20-rf%20%2f HTTP/1.0

или
GET /tmp%0d%0acat%20%2fetc%2fpasswd%20%3e%2fvar%2fwww%2fhtdocs%2ftmp HTTP/1.0

?

slonishka

рискну предположить, что будет много минусиков.

tokuchu

А как это будет работать в случае конкурентного доступа?
Т.е. если подключатся 2 клиента одновременно, а файла ещё не будет. Они будут в одно и то же место писать одновременно?

uncle17

ну а как же
нет, о таком я еще не думал. И еще не надо.

korsar0156

index.php
<?
$name = $_SERVER['QUERY_STRING'];
$content = "$name (test)";
file_put_contents( $name, $content);
echo "$content (from script)";

только что проверил под виндой - скрипт вызывается только для отсутствующих файлов.
Оставить комментарий
Имя или ник:
Комментарий: