.htaccess - 别名对子目录的所有www-only请求

时间:2013-07-01 22:43:12

标签: .htaccess

尝试安装精彩的Concrete5 CMS作为我的主站点引擎 - 问题是它有大约15个不同的文件和目录,它们弄乱了我的根。我真的想将它移到/_concrete/子目录中,并仍然在域根目录中维护它。

htaccess从未成为我的强项 - 经过大量的研究和学习,以及大量的错误500,我的沮丧压倒了我的骄傲,我在这里张贴。这正是我想要实现的目标:

  • 通过www.domain.com发出的任何请求都会转发到www.domain.com/_concrete/,但现有文件除外。
  • 最终用户网址不应更改 - 他们仍会将该网站视为www.domain.com,即使他们已投放www.domain.com/_concrete/
  • 此网站上存在多个子域作为根目录中的子文件夹 - 因此,只应重定向通过www.domain.com的请求。

这是我用我的htaccess最接近的,它会产生错误500:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !^_concrete
RewriteRule ^(.*)$ _concrete/$1 [L,QSA]

这是4小时的汗水和血液(主要是血液)的结果,所以我必须要靠近。我希望你的一个优秀的头脑可以指出一个愚蠢的错误,并迅速让这件事得以休息。谢谢你的时间!


附录:我刚才发布了.htaccess - alias domain root to subfolder,这让我开始了。请不要陷入认为它是重复的陷阱。

1 个答案:

答案 0 :(得分:1)

问题是内部重定向循环, %{REQUEST_FILENAME}包含文件的绝对系统路径(/ home / user / ...)而不是Url Path, 第三个条件表明所请求文件的系统路径以_concrete开头,永远不会成为现实。

重现发生的事情,例如,请求/contact(不是文件):  url传递所有重写条件,请求被内部重定向到/_concrete/contact,现在Mod_Rewrite将再次重新执行htaccess(L标志仅当前运行,如果url已更改,则规则将是再次应用于新网址

因此,新网址/_concrete/contact也会传递所有条件并重写为/_concrete/_concrete/contact,依此类推...... 这将产生一个重定向循环,Apache将输出500错误消息

要解决这个问题,你必须改变你的第三个条件:

RewriteCond %{REQUEST_URI} !^/_concrete