我正在布局一个具有多个公用文件夹的系统,并且需要.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文件路径。当单个应用程序文件夹直接加载时,它们的处理方式不同,并且已经有效,并且无法为此目的进行更改。
答案 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