显然,网上有很多关于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"前面的"!"是不正确的