将所有网站流量重定向到PHP处理程序,陷阱?

时间:2012-01-15 13:32:16

标签: php mod-rewrite

我正在使用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提供的任何性能增强,例如请求缓存吗?

其次,用现状来说,还有更好的方法吗?

1 个答案:

答案 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个问题:

  • 为什么处理几个网站安装相同的cms,多次部署cms,每个网站一个通常更好,恕我直言。但无论如何,为什么不呢。
  • 为什么要在静态资源网址上隐藏网站名称?

对于第二个问题,我只能看到一个原因,那就是优化这些资产的缓存策略。您想说www.example1.com/static/images/foo.pngwww.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]

此解决方案增加了几个限制:

  • 您应该有一个专用的virtualHost(更好)或rewriteRule(用于.htaccess后备)重写所有备用域名访问已处理域的规范域名。它对SEO也更好。如果http://domain1.com/static/images/foo.png可以,但不是http://www.domain1.com/static/images/foo.pnghttp://foo.domain1.com/static/images/foo.png,则应检查http://DOmaiN1.com/static/images/foo.png
  • 存储资产的子目录必须与HHTP_HOST完全相同,不能自由。
  • 此规则不会阻止使用domain1.com/static/images/foo.png direclty,因此用户仍然可以构建错误的链接,还可以添加其他一些包含301重定向的rewriteRule。