最后我找到了一个可行的解决方案,在我的场景中非常完美,它不需要子域。在这种情况下,Laravel 完全充当 RESTful Web 服务,没有服务器端视图或模板:AngularJS 完全需要表示层。
假设我在同一个根文件夹中有两个完全解耦的应用程序(FE e WS):
root
|__fe
|__ws
我通过以下方式修改了 Apache httpd-vhosts.conf 文件下的虚拟主机设置:
<VirtualHost *:80>
ServerName myapp.com
DocumentRoot "\www\root\fe"
alias /ws "\www\root\ws\public"
<Directory "\www\root\ws\public">
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
然后我将“RewriteBase /ws”添加到我的 laravel/public/.htacces 文件中:
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /ws
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [NC,L]
</IfModule>
这样我可以在浏览器中编写(例如):
http://myapp.com (AngularJS client side root)
http://myapp.com/ws/users (RESTful service endpoint for "users")
然后定义一个客户端,AngularJS路由如下方式:
app.config(function($routeProvider) {
$routeProvider
.when('/', {controller: 'HomeController', templateUrl: 'templates/home.html'})
.when('/users', {controller: 'UsersController', templateUrl: 'templates/users.html'})
.otherwise({redirectTo: '/'});
});
以这种方式将其链接到 RESTful 资源:
app.factory('User', function($resource) {
return $resource('http://myapp.com/ws/users');
});
app.controller('UsersController', function($scope, User) {
$scope.title = "Users";
$scope.users = User.query();
});
我启用了 HTML5 历史 API,添加了这一行来配置我的 Angular 应用程序:
$locationProvider.html5Mode(true);
连同(在 index.html 头部分内):
<base href="/" />
<meta name="fragment" content="!" />
因此,解决浏览器页面刷新、深度链接或直接页面书签等问题的最后一个要求是在包含 Angular 应用程序的文件夹的根目录中添加一个 .htaccess 文件:
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [NC,L]
</IfModule>
希望能帮助到你!