重写apache 2的规则,以便与angular js一起使用



显然,网上有很多关于mod重写的讨论和答案。然而,我很难掌握它们。所以我想我应该在这里问一下。

我要求重写规则来做Andy Joslin在评论中解释的事情:https://stackoverflow.com/a/11100438

这是我当前在example.com根目录下的目录结构

  • app/
  • app/index.html (angular js应用的"根")
  • api(这将是一个symfony 2应用程序,用于'api'。我将从angular发送ajax请求到这里。)

我想将所有请求重定向到app/index.html,除了请求到/api。

例如:

http://example.com/categories/electronics/ipod实际上就像转到http://example.com/app/index.html/categories/electronics/ipod

我想为app/index.html部分被隐藏然而。

然后,对http://example.com/api的请求会有一个例外,因为我需要对这些url路径进行ajax请求。

感谢所有的帮助和指导。

这个问题的公认答案已经过时了。你现在可以在Apache 2.2.16+的配置文件中使用FallbackResource指令了。

FallbackResource /app/index.html

如果你想让FallbackResource指令忽略"/api"路由:

<Directory /api>
FallbackResource disabled
</Directory> 

这里有一些东西可以让你开始(把它放在你的/。htaccess):

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/api
# otherwise forward it to index.html 
RewriteRule ^.*$ - [NC,L]
RewriteRule ^app/. /app/index.html [NC,L]

注意:对于较新的Apache版本,请参见下一个答案,它使用更简单的FallbackResource

这个答案的问题是,您仍然需要为file-not-found设置404。根据一个人如何构建前端应用程序,css或其他文件返回404是很常见的,特别是如果他们正在构建更大的动态应用程序,或者外包前端工作。此外,angular路由通常与文件系统上的任何内容都没有关系。如果您将其缩小到单个目录,上述方法可能有效。例如,我通常会为所有与文件系统布局无关的angular路由使用一个通用前缀(/ajs/)。如果你能

<Directory /ajs>
FallbackResource /app/index.html
</Directory> 

那就更有意义了,但这似乎对我不起作用。使用公共前缀还可以使后端规则更加简单,无论后端是什么。例如,如果不使用反向代理,可以设置一个简单的服务器转发控制器。它使apache重写规则的建模变得简单。例如:

RewriteEngine On
RewriteRule ^/ajs/(.+)$ /index.html

也就是说,我以前没有见过目录/回退方法,所以当我唯一需要重写的是角向前时,我有兴趣探索它。谢谢!

这是Scott Ferguson的精彩回答的细微变化和阐述。我发现使用<Location>指令比使用<Directory>指令更容易。<Directory>指令采用绝对路径名,不同的机器可以有不同的路径名。

那么,让我们假设你的Angular应用的index.html在你的web服务器文档根目录下的my-app/index.html中。并且您希望使用http://localhost/my-app访问应用程序。

首先确保你的base href是"/my-app/"。接下来,在httpd.conf文件中添加:

<Location "/my-app">
    FallbackResource /my-app/index.html
</Location>

如果无法找到/my-app/下的资源,将导致Apache加载index.html。

如果您在相同的路径下进行API调用,例如/my-app/api,那么您可能不应该对这些调用应用FallbackResource规则。所以添加:

<Location "/my-app/api">
    FallbackResource disabled
</Location>

从我的生产服务器:

<VirtualHost *:80>
        ServerName XXX.com
        DocumentRoot /home/www/XXX.com/www
        # Local Tomcat server
        <Location /api/>
          ProxyPass http://localhost:8080/api/
          ProxyPassReverse http://localhost:8080/api/
        </Location>
        RewriteEngine On
        # If an existing asset or directory or API is requested go to it as it is
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR]
        RewriteCond %{REQUEST_URI} /api
        RewriteRule ^ - [L]
        # If the requested resource doesn't exist (and is not API), use index.html
        RewriteRule ^ /index.html
        ErrorLog logs/XXX.com-error.log
        CustomLog logs/XXX.com-access.log common
</VirtualHost>

请注意,被接受的答案中"/api"前面的"!"是不正确的

最新更新