我的应用程序中有一些api调用,我想重写为静态.json
文件(缓存)。
我的网站是针对音乐事件而我想要重写为缓存的api调用是接下来的7天,所以需要重新定位7个网址。
所以网址看起来像这样:
api.domain.com/?date=2013-12-01 -> cache_2013_12_01.json
api.domain.com/?date=2013-12-02 -> cache_2013_12_02.json
api.domain.com/?date=2013-12-03 -> cache_2013_12_03.json
api.domain.com/?date=2013-12-04 -> cache_2013_12_04.json
api.domain.com/?date=2013-12-05 -> cache_2013_12_05.json
api.domain.com/?date=2013-12-06 -> cache_2013_12_06.json
api.domain.com/?date=2013-12-07 -> cache_2013_12_07.json
但我不想重定向任何以后的日期
api.domain.com/?date=2013-12-08 -> doesn't redirect
有没有办法可以创建这些重定向而不用每天用PHP重写我的.htaccess文件?
由于
答案 0 :(得分:0)
我不认为.htaccess可以做到这一点。但用PHP重写.htaccess有点危险。
我认为你可以创建一个json文件夹,例如jsondir,并让php每天只用7个文件重新填充这个文件夹。并将其添加到.htaccess文件中:
RewriteCond %{HTTP_HOST} ^api.domain.com$
RewriteCond %{QUERY_STRING} date=(\d{4})-(\d{2})-(\d{2})
RewriteRule ^$ jsondir/cache_%1_%2_%3.json [L]
答案 1 :(得分:0)
我能想到的最好的方法是检查缓存的文件是否存在: 我仍然希望能够创建一个仅与接下来的七天相匹配的条件,因为在将来8个星期的缓存日检查文件是否存在似乎有点浪费天...
RewriteCond %{HTTP_HOST} ^api.
RewriteCond %{QUERY_STRING} ^date=(\d{4})-(\d{2})-(\d{2})$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -f [OR]
RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -d
RewriteRule ^(.*)$ cache/%1.json [L]
答案 2 :(得分:0)
首先,我认为安德鲁的方法基本上是正确的,这是一个很好的方法,而且你试图向你展示替代方法是错误的。此外,这将是一个聪明的答案,因为我将概述的方法不是真的更好,只是有趣。但是我喜欢宣传mod_rewrite实际上是一种图灵完备的语言,能够比人们给予它的信任更多。
总之。真正的问题是:mod_rewrite可以使用日期吗?它可以:Apache通过几个环境变量公开有关当前时间和日期的信息:%{TIME}
,%{TIME_DAY}
,%{TIME_MON}
和%{TIME_YEAR}
都可以用于RewriteConds来实现neat effects。例如,我们可以只提供过去几年的文件:
RewriteCond %{QUERY_STRING} date=(\d{4})-(\d{2})-(\d{2})
RewriteCond %{TIME_YEAR} < %4
不幸的是,mod_rewrite无法进行算术运算(实际上,我们可以单独用mod_rewrite进行算术运算。我们可以,但我们不想!),所以我们似乎被困在这里。
然而,mod_rewrite有一个很好的扩展语言的机制:通过使用RewriteMap,我们实际上可以定义外部重写程序,我们可以将它们用作重写中的函数。写一个“从当前日期减去七天”程序将是微不足道的,所以我们可以说
RewriteMap sub7day prg:subtract_7_days.py
RewriteCond %{QUERY_STRING} date=(\d{4}-\d{2}-\d{2})
RewriteCond ${sub7days:%1} -lt %{TIME}
简而言之:使用RewriteMap(利用服务器端语言的表现力)完全可行,甚至可行。
那就是说,我个人用PHP做这个,就像这样:
RewriteCond %{QUERY_STRING} date=(\d{4}-\d{2}-\d{2})
RewriteRule .* cache_serve.php?date=%0
然后我可以在PHP中找出逻辑,这比使用mod_rewrite要少得多,而且容易出错。