我现在已经重写了这个问题,因为我认为这个问题与URL重写没有关系。
我正在使用PHP和Smarty构建一个站点,并使用apache的mod重写使用相当常见的url重写。
在本地,如果我访问: example.com/search/?q=test ,我会收到“test”的搜索结果。 / search 不是真正的目录,它转发到 search.php?q =
当我上传时,它无法正常工作。我已启用sudo a2enmod rewrite
重写并且网址正在更新,浏览器在地址栏中显示 example.com/search/?q=test ,不会抛出404,但是只是提供我的index.php页面。
我意识到问题可能与我的Smarty缓存有关。我有一个URL变量触发要重建的缓存,?rebuildCacheNow 。
如果我转到 / account ,我会获得索引页面,但如果我转到 / account?rebuildCacheNow ,则会显示帐户页面。
如果我返回索引 / ,它仍会显示帐户页面。转到 /?rebuildCacheNow 会显示主页。
这是我的主要Smarty模板:
{* Smarty *}
<!DOCTYPE html>
<!--[if lt IE 7 ]><html class="ie ie6" lang="en"><![endif]-->
<!--[if IE 7 ]><html class="ie ie7" lang="en"><![endif]-->
<!--[if IE 8 ]><html class="ie ie8" lang="en"><![endif]-->
<!--[if gt IE 8]><!--><html lang="en"><!--<![endif]-->
{include 'head.tpl'}
<body id="top">
{include 'header.tpl'}
<div class="content-container">
<div class="container content">
{include $page.content}
</div>
</div>
{include 'footer.tpl'}
<script src="{$JQUERY_CDN}"></script>
<script src="{$BOOTSTRAP_JS_CDN}"></script>
<script src="/js/main.js"></script>
{$page.scripts}
</body>
</html>
每个页面都提供此模板,但我使用PHP来分配$page.content
。因此, / buy 页面设置$page.content = 'buy.tpl'
和 / search 设置$page.content = 'search.tpl'
。
但看起来main.tpl
正在被缓存 - 是否有更好的方法可以使用1个主要大纲模板并在其中嵌入内容模板?
答案 0 :(得分:0)
好的我已经解决了。所以我在本地设置rebuildCacheNow
设置在每个页面上都有,以确保每次都能看到更改 - 这就是我没注意到的原因。
当我解决问题时,它与main.tpl
的缓存有关,检查Smarty文档显示我可以将cache_id分配给渲染模板:
http://www.smarty.net/docsv2/en/caching.multiple.caches.tpl
所以当我渲染Smarty模板时,我会根据$page.content
变量的哈希值给它提供缓存ID:
// make cache id, based on template path
$cache_id = sha1( $page[ 'content' ] );
$smarty->display( 'main.tpl', $cache_id );