htaccess和多个公用文件夹

时间:2017-03-26 05:09:12

标签: apache .htaccess mod-rewrite

我正在布局一个具有多个公用文件夹的系统,并且需要.htaccess来允许访问所有公用文件夹,但只能访问公用文件夹。

目录结构如下所示:

apps
  -app1
    -public
  -app2
    -public
  -app3
    -public
public
system
  -public

根公用文件夹具有共享脚本,图像和css资产,稍后可根据需要将其打包到单个应用程序文件夹中,以便它们可以作为独立应用程序部署,并包含前端控制器。系统文件夹具有用于系统管理和调试的脚本和css资产。应用程序文件夹有自己的公共文件夹,直接运行时不需要依赖系统资产。

我需要我的htaccess来公开所有这些公共文件夹,而不必放置" public"在网址中,即:

somedomain.com/css/something.css 应映射到:somedomain.com/public/css/something.css

somedomain.com/system/css/something.css 应映射到:somedomain.com/system/public/something.css

somedomain.com/app1/css/something.css 应映射到:somedomain.com/apps/app1/public/css/something.css

在我现有的.htaccess中,我尝试了多种方法来映射这些,但没有运气。基本级公用文件夹映射正常,但是当我必须重写到一个以上级别的公共文件夹(即系统和应用程序)时会出现问题。

我真的不知道这有什么问题,但现在我的情况如下:

# Change default directory page
DirectoryIndex index.php index.html

# Prevent directory listings
Options All -Indexes -Multiviews

<IfModule mod_rewrite.c>
    RewriteEngine On
    Options +FollowSymlinks

    #App folder block
    #Does not match system folder
    RewriteCond %{REQUEST_URI} !^/system
    #Does match an app folder
    RewriteCond %{REQUEST_URI} ^/apps/([a-zA-Z0-9\-\_]*)$
    #Does not match an app public folder
    RewriteCond %{REQUEST_URI} !^/apps/([a-zA-Z0-9\-\_]*)/public
    #Redirect to specified app public folder
    RewriteRule ((!?apps/)(!?public/).*)$ apps/$1/public/$2 [L,NC]

    #System folder block
    #Does match system folder
    RewriteCond %{REQUEST_URI} ^/system(/.*) [NC]
    #Does not match system public folder
    RewriteCond %{REQUEST_URI} !^/system/public [NC]
    #Redirect to system public folder
    RewriteRule . /system/public/$1 [L,NC]

    #Root public folder block
    #Does not match root public folder
    RewriteCond %{REQUEST_URI} !^/public/
    #Does not match system public folder
    RewriteCond %{REQUEST_URI} !^/system/public/
    #Does not match an app public folder
    RewriteCond %{REQUEST_URI} !^/apps/([a-zA-Z0-9\-\_]*)/public/
    #Redirect all remaining requests to front controller
    RewriteRule ^(.*)$ public/index.php?action=$1 [QSA,L]
</IfModule>

当我尝试加载somedomain.com/system/css/something.css

时,我的访问日志会返回以下内容
127.0.0.1 - - [25/Mar/2017:23:04:13 -0600] "GET /system/css/something.css HTTP/1.1" 200 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7"

该页面返回状态代码200 OK,但没有内容加载,并且根据访问日志,没有给出任何文件的有效路由。

如果我像这样引用同一个文件:somedomain.com/system/public/css/something.css那么它加载正常,但我需要&#34; public&#34;不包括在网址中。到目前为止,这仅适用于根级公用文件夹。

当我注释掉除了与系统公用文件夹有关的部分以外的所有内容时,这种行为是一致的,因此不会有其他规则干扰该行为。

注意:需要没有通用

的解决方案
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

原因是永远不应该有任何直接目录访问,并且总是重写实际的公共html文件路径。当单个应用程序文件夹直接加载时,它们的处理方式不同,并且已经有效,并且无法为此目的进行更改。

1 个答案:

答案 0 :(得分:2)

有这样的话:

# Change default directory page
DirectoryIndex index.php index.html

# Prevent directory listings
Options All -Indexes -Multiviews
RewriteEngine On

# handle /app1, /app2, /app3
RewriteCond %{DOCUMENT_ROOT}/apps/$1/public/$2 -f
RewriteRule ^([\w-]+)/(css/.+)$ apps/$1/public/$2 [L,NC]

# handle /system/css/
RewriteRule ^(system)/css/(.+)$ $1/public/$1 [L,NC]

# handle /css
RewriteRule ^css/.+$ public/$0 [L,NC]

# your remaining rewrite rules, if any