【问题标题】:Setting base directory for Apache Alias and static resource files为 Apache Alias 和静态资源文件设置基目录
【发布时间】:2013-05-23 00:08:34
【问题描述】:

我一直在到处寻找这个问题的答案,但我似乎找不到任何简单的解决方案。我不明白这么简单的事情为什么要这么复杂。

所以基本上 - 我想做的是在我的 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>

现在,当我转到 url: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 设置,要求任何文件 - 使用绝对路径,都应该以 http://localhost/sitex/* 而不仅仅是 http://localhost/* 开头。换句话说,基本路径发生了变化。

我尝试过 AliasMatch、DirectoryMatch、RewriteRules RewriteBase,但似乎都无法改变这一点。

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

【问题讨论】:

    标签: apache mod-rewrite static resources alias


    【解决方案1】:

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

    • SCRIPT_FILENAMEREQUEST_URI 不同。如果您应用了一些重写规则并更改了 URI,那么您需要与SCRIPT_FILENAME 进行比较,因为REQUEST_URI永远改变(根据我自己的实验,但我可能错了)
    • 如果您将整个文件名(例如 /web/htdocs/olivier/zer/szzae/Symfony/web/app.php)放在重写规则中,而不是 relative URI,那么在比较和重写规则中会以不同方式处理。

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

    你可以这样做(没有尝试过,但我在我的网站中使用了其中的一些):

    # 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]    
    

    您可以添加一个条件:如果文件在您的“基础”目录中找到,则覆盖,否则让 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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多