.htaccess的AngularJS应用程序与HTML5模式的子文件夹

概述:

我有一个使用$locationProvider.html5Mode(true)的AngularJS应用程序,它是从Apache服务器提供的。 到目前为止,我使用源代码从其他人访问,我只需要redirect到index.html的angularJS的HTML5模式。 所以我有这个为我的/app文件夹的.htaccess文件。

.htaccess:

 <IfModule mod_rewrite.c> RewriteEngine on # Don't rewrite files or directories RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # Rewrite everything else to index.html to allow html5 state links RewriteRule ^ index.html [L] </IfModule> 

修改:

然后,我添加了Grunt来缩小应用程序的/dist文件夹中生成的整个解决scheme(所以现在缩小的解决scheme在/ app / dist中)。 我现在想将我的应用程序的整个stream量路由到缩小版本,而不会让用户更改链接。 所以,在实践中,我想将每个来自/ app的调用redirect到/ app / dist。

目录结构现在:

 app dist minified versions(css,html,js) 

我尝试在/ app的.htaccess中使用这里的一些条件,并移动/ app / dist中的其他.htaccess文件,但没有成功。 我甚至不知道这两者是否可以这样结合。 我知道我可以使用dist文件夹作为/应用程序,但我不会真的想这样做,因为/ app是一个回购,它更容易保持更新。 那么我怎样才能实现这个redirect呢?

此外,作为第二件事情,是否有可能把一个标志不知何故,我让阿尔法用户使用正常(未缩小)的版本更好的debugging?

更新:

我在这里添加了一个示例项目。 我只保留了上面显示的初始.htaccess文件,您可以检查两个版本( /test/test/dist )是否如上所述工作。 此外,它可能有一些未使用的代码和依赖项,但我只是从我的项目中删除其他部分(不要判断:D)。

为此,我使用了AngularJS 1.4.8的初始configuration,可能会产生一些像这里和这里所述的错误。 随意将AngularJS版本更新到1.5.8(Angular 1的最后一个稳定版本),但同时考虑到Cosmin Ababei的post上的评论。 另外,该项目使用npm来安装grunt(以及其他的grunt扩展),bower for angular和其他一些基本组件,以及用于构build缩小版本的grunt(实际上,它现在只是将资源连接在相同的文件中)。 如果您需要更改依赖项,请不要忘记运行bower install 。 如果你想重新生成dist文件夹,不要忘记运行npm installgrunt build

我将假定在/dist目录里有index.html ,并且更新的URL指向缩小的资源和正确的<base>标记。 请注意, <base>标记必须指向/dist文件夹 – 只需将/dist附加到您为未压缩的 index.html使用的值,您就可以。

有了这些东西,这里是更新的.htaccess文件:

 RewriteEngine On # Don't rewrite files RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] # If the ALPHA_USER cookie is set, serve the uncompressed files RewriteCond %{HTTP_COOKIE} ALPHA_USER [NC] RewriteRule ^ index.html [L] # Rewrite everything RewriteRule ^ dist/index.html [L] 

你会注意到两件事情:

  • 我已经删除了RewriteCond %{REQUEST_FILENAME} -d因为很可能你不需要为整个目录服务

  • 我添加了ALPHA_USER cookie,将用户重定向到未压缩的文件。 这个cookie可以有你想要的任何价值。

在public_html => / app => .htaccess里面试试这个:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ dist/index.html [L] 

注意: HTML <base>标签应该指向dist文件夹。 我希望这个解决方案能按照你的期望工作。