设置Apache别名和静态资源文件的基目录

时间:2013-05-28 06:08:23

标签: apache mod-rewrite static resources alias

我一直在寻找这方面的答案,我似乎无法找到任何简单的解决方案。我无法理解为什么这么简单的事情会如此复杂。

所以基本上 - 我想要做的是在我的apache上映射一些本地站点,每个站点都有自己的css / js等。然后在我的apache conf中我设置了一些别名:

# site 1
Alias /site1 "C:/www/site1"
<Directory "C:/www/site1">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

# site 2
Alias /site1 "C:/www/site2"
<Directory "C:/www/site2">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

现在,当我转到网址:http://localhost/site1/时,将提供site1的内容 - 正在加载index.html。一切都很好。在我的文件中,我使用绝对路径从文件夹链接css和js - 例如/css/styles.css/js/scripts.js

当通过apache提供这些文件时,它们将获得以下路径:

http://localhost/css/styles.css(忽略'site1'),原因当然是因为我已经要求通过指定绝对路径从我的webroot“localhost”出发。

为什么绝对路径?我需要能够将我的.html文件更深入地移动到我的网站的文件夹结构中 - 这意味着它们在哪里 - 他们无法知道资源文件的位置 - 除非我能告诉他们从某个点开始 - 网络根。

所以问题是:

没有任何简单的方法可以告诉我的Alias设置,使用绝对路径要求的任何文件都应该以{{1​​}}而不是http://localhost/sitex/*开头。换句话说,基本路径已更改。

我已经尝试过AliasMatch,DirectoryMatch,RewriteRules RewriteBase,但所有看似无法改变这一点。

也许我应该使用Alias以外的东西?

1 个答案:

答案 0 :(得分:1)

请仔细阅读Apache RewriteRule文档。 如果你想改变一些东西,你需要了解那些基本面的东西(我在这里给你“多天尝试和搜索”):

  • SCRIPT_FILENAMEREQUEST_URI不同。如果您应用了一些重写规则并更改了URI,那么您需要与SCRIPT_FILENAME进行比较,因为REQUEST_URI从不更改(来自我自己的实验,但我可能错了) )
  • 如果您在重写规则中放置了一个完整的文件名(例如/web/htdocs/olivier/zer/szzae/Symfony/web/app.php),而不是 relative URI,那么在比较和重写规则中将区别对待。< / LI>

因此,根据您的需要,也许您在技术上尝试做的事情不是解决问题的正确方法。

你可以做类似的事情(没有尝试,但我在我的网站上使用了一些):

# if this is a static file, extract the extension into `EXT`:
RewriteRule (.*)(\.(css|js|txt|pdf|jpg|jpeg|gif|png|ico))$ $1$2 [NC,QSA,E=EXT:$3]
# .. do some processing then ..
# if the file is css or js (modify it for your needs)
RewriteCond %{ENV:EXT} (css|js|txt)$
# then here's the hint that may save your life!!
# rewrite the file to "previous" content
# AND whole filename, *not* relative URI
RewriteRule  ^(.+) %{DOCUMENT_ROOT}/..%{REQUEST_FILENAME} [QSA,L]    

你可以添加一个条件:如果在你的“base”目录中找到了文件,那么覆盖,否则让Apache“自然地”对待它(=尝试从网站本身获取它):

# checks if it exists, and if so then
RewriteCond %{DOCUMENT_ROOT}/..%{REQUEST_FILENAME} -f
RewriteRule  ^(.+) %{DOCUMENT_ROOT}/..%{REQUEST_FILENAME} [QSA,L]    

注意:我没有测试:尝试使用/..%{REQUEST_FILENAME}/../%{REQUEST_FILENAME}(请注意 /

现在是阅读时间:阅读直通指令here

希望这有帮助!