我正在使用PHP构建自定义迷你cms。我目前正在使用将不存在的文件的所有请求重定向到单个PHP索引并根据路径输出内容的常用技术。这适用于“页面”。
Apache mod_rewrite规则;
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
直接提供实际作为物理文件存在的资源文件(图像,css,javascript等)。我的问题是这暴露了这些文件的真实服务器路径,例如
“/ mycms /网站/谷歌/主题/蓝/ CSS / Styles.css中”
我希望这个例子被掩盖为;
“/主题/蓝/ CSS / Styles.css中”
由于此请求不存在,使用我当前的体系结构,它将被重定向到我的PHP索引处理程序。我无法真实地开始为每个网站和每个主题添加Apache mod_rewrite规则。所以我现在假设解决这个问题的唯一方法是通过我的PHP处理程序处理所有资源文件,使用它来读取服务器上的文件并吐出正确的内容类型。
首先,如果这是唯一的解决方案,我需要小心,我不会破坏apache提供的任何性能增强,例如请求缓存吗?
其次,用现状来说,还有更好的方法吗?
答案 0 :(得分:1)
如果您正在构建新的CMS,请立即尝试添加在Web根目录中存储静态资源的功能,以及在该Web根目录之外存储 php库的功能。仅保留web根目录中的index.php。
所以这首先给出了这棵树:
path/
\-to/
\-cms/
\-www/
\-index.php
-static\
\-js/ /* cms shared js */
-css/ /* cms shared css */
-images/ /* cms shared images */
\-lib/
\-cms.php /*lots of php files related to the cms*/
现在你要处理同一个cms内的几个网站,并隐藏静态资源的网站名称...这导致了2个问题:
对于第二个问题,我只能看到一个原因,那就是优化这些资产的缓存策略。您想说www.example1.com/static/images/foo.png
与www.example2.com/static/images/foo.png
的图像相同。配置良好的反向代理可以做的事情。但是一个好的cms也可以为共享静态资源处理共享域,例如:cdn.example.com/static/shared/images/foo.png
。
现在你可能真的有这样丑陋的网址:http://www.example2.com/cms/www.examples2.com/static/images/foo.png
。是的,这非常难看,只是因为您可以尝试通过手动更改链接来浏览example2.com时从example1.com检查一些静态资产。所以有人可以发送一个网址http://www.seriouswebsite.com/static/images/adultcontent.com/foo.png
声称seriouswebsite.com正在存储一些丑陋的图片,这只是因为adultcontent.com是在具有相同cms的同一服务器中处理的。 现在这不是很重要,在其他cms中完成,例如在Drupal多域默认管理中,例如。我假设你有这种情况,你不想要,并且你希望它以这种形式的网址处理:http://www.example2.com/images/foo.png
。
忘记使用PHP处理静态文件管理。静态文件实际上很快就可以由Web服务器处理,甚至可以通过反向代理缓存来处理。 PHP会杀死你的表演。
所以你现在是多域cms树:
path/
\-to/
\-cms/
\-www/
\-index.php
-static\
\-js/ /* cms shared js */
-css/ /* cms shared css */
-images/ /* cms shared images */
-domain1.com/
\-static\
\-js/
-css/
-images/
-domain2.net/
\-static\
\-js/
-css/
-images/
\-lib/
\-cms.php /*lots of php files related to the cms*/
其中一个解决方案是静态内容的rewriteRule,为域名添加静态URL前缀,但您将无法加载cms共享资源。如果特定于域的资源以关键字为前缀(例如“local”。
),您仍然可以这样做所以得到:
# private image
/path/to/cms/www/domain1.com/static/images/foo.png => http://domain1.com/static/local/images/foo.png
# shared by the cms
/path/to/cms/www/static/images/foo.png => http://domain1.com/static/images/foo.png
当当前域名为domain1.com时,rewriteRule现在必须检测到“静态/本地”部分并将其重写为“ static / domain1.com ”。像那样(未经测试):
RewriteRule ^static/local/(.*)$ %{HTTP_HOST}/static/$1 [QSA,L]
此解决方案增加了几个限制:
http://domain1.com/static/images/foo.png
可以,但不是http://www.domain1.com/static/images/foo.png
或http://foo.domain1.com/static/images/foo.png
,则应检查http://DOmaiN1.com/static/images/foo.png
。domain1.com/static/images/foo.png
direclty,因此用户仍然可以构建错误的链接,还可以添加其他一些包含301重定向的rewriteRule。