.htaccess:不能将具有特殊主机名的资源重写为正确的路径


.htaccess : Can't rewrite assets with a special host name to a proper path

我有一个Laravel应用程序,我希望它加载一个角应用程序,当用户已经被认证,并请求一个特殊的子域驻留在/public目录

假设我的public包含:

'---ng
    '---app
       +---bower_components
       |   +---angular
       |   +---angular-loader
       |   +---angular-mocks
       |   +---angular-route
       |   '---html5-boilerplate
       |       +---dist
       |       |   +---css
       |       |   +---doc
       |       |   +---img
       |       |   '---js
       |       |       '---vendor
       |       +---src
       |       |   +---css
       |       |   +---doc
       |       |   +---img
       |       |   '---js
       |       |       '---vendor
       |       '---test
       +---components
       |   '---version
       +---view1
       '---view2

my .htaccess:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    RewriteCond %{HTTP_HOST} sub'.domain'.com
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*) ng/app/$1 [L]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

问题:

当我请求例如http://sub.domain.com:8080/bower_components/html5-boilerplate/dist/css/normalize.css

Laravel返回404

我如何从公共目录加载这个ng应用程序,但也通过laravel的index.php运行请求来检查身份验证和授权

/bower_components/html5-boilerplate/dist/css/normalize.css不映射到现有文件。这就是为什么第二条规则

的条件
RewriteCond %{REQUEST_FILENAME} -f

不匹配,第三条规则

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

。Laravel不知道如何处理这个请求,并报告一个错误404。

详情见RewriteCond

REQUEST_FILENAME
如果在引用REQUEST_FILENAME时服务器已经确定了匹配请求的文件或脚本的完整本地文件系统路径。否则,例如在虚拟主机上下文中使用时,与REQUEST_URI相同的值。根据AcceptPathInfo的值,服务器可能只使用了REQUEST_URI的一些前导组件来将请求映射到文件。


如果你想检查一个文件的请求路径,你可以用%{DOCUMENT_ROOT}/ng/app作为变量的前缀,看看它是否对应于一个现有的文件,例如

RewriteCond %{DOCUMENT_ROOT}/ng/app%{REQUEST_URI} -f
RewriteRule ^ ng/app%{REQUEST_URI} [L]

尝试使用:

RewriteCond %{REQUEST_FILENAME} !-f

代替:

RewriteCond %{REQUEST_FILENAME} -f