簡體   English   中英

Apache Mod_Rewrite:包含具有基於日期的變量的動態重寫

[英]Apache Mod_Rewrite: include dynamic rewrites with date based variable

我的應用程序中有一些api調用,我想將其重寫為靜態.json文件(緩存)。

我的網站用於音樂活動,我要重寫以緩存的api調用是接下來7天的api調用,因此要重定向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文件?

謝謝

我認為.htaccess無法做到這一點。 但是用php重寫.htaccess有點危險。

我認為您可以只創建一個json文件文件夾,例如egsegdir,並使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]

我能提出的最好的辦法是檢查緩存的文件是否存在:我仍然希望能夠創建一個僅與接下來的7天匹配的條件,因為檢查一個該文件存在於未來8周的某個緩存日,而該緩存僅前進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]

首先,我認為安德魯的方法本質上是正確的,這將是解決問題的好方法,並且錯誤地指責他試圖向您展示替代方法是錯誤的。 另外,這將是一個聰明的答案,因為我將概述的方法並不是真正可取的,只是很有趣。 但是我想傳福音,mod_rewrite實際上是一種圖靈完備的語言,其功能遠超出人們的認可。

無論如何。 真正的問題是:mod_rewrite可以和日期一起使用嗎? 可以做得很好:Apache通過幾個環境變量公開了有關當前時間和日期的信息: %{TIME}%{TIME_DAY}%{TIME_MON}%{TIME_YEAR}都可以在RewriteConds中使用,以達到整潔的效果 例如,我們只能提供過去幾年的文件:

RewriteCond %{QUERY_STRING} date=(\d{4})-(\d{2})-(\d{2})
RewriteCond %{TIME_YEAR} < %4

不幸的是,mod_rewrite沒有提供算術的方法(實際上,我們可以單獨使用mod_rewrite進行算術。可以,但是我們不想!),所以我們似乎停留在這里。

但是,mod_rewrite具有擴展語言的良好機制:通過使用RewriteMap ,我們實際上可以定義外部重寫程序,可以將其用作重寫函數。 編寫“從當前日期減去7天”程序是微不足道的,所以我們可以說

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時令人沮喪的多,並且不易出錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM