用于角度js的apache 2的重写规则

时间:2013-03-07 23:38:59

标签: apache mod-rewrite angularjs rewrite

显然,整个网络上都有很多mod重写讨论和答案。但是,我很难抓住它们。所以我想我会问这里。

我要求重写规则来执行Andy Joslin在评论中解释的内容:https://stackoverflow.com/a/11100438

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

  • 应用程序/
  • app / index.html(角度js应用程序的“根”)
  • api(这将是一个用于'api'的symfony 2应用程序。我将从此处向角度发送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的请求会有例外情况,因为我需要向这些网址路径发出ajax请求。

感谢您提供的所有帮助/指导。

5 个答案:

答案 0 :(得分:24)

这个问题的接受答案已经过时了。您现在可以在conf文件中使用Apache 2.2.16 +。

中的FallbackResource指令
FallbackResource /app/index.html

如果您希望FallbackResource指令忽略“/ api”路由:

<Directory /api>
FallbackResource disabled
</Directory> 

答案 1 :(得分:13)

这是让你前进的东西(把它放在你的/.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]

答案 2 :(得分:0)

这个答案的问题是你仍然想要404s文件未找到。根据一个人如何构建他们的前端应用程序,人们常常让css或其他文件返回404,特别是如果他们正在构建更大的动态应用程序,或者正在外包前端工作。此外,角度路由通常与文件系统上的任何内容无关。如果将其缩小到单个目录,则上述操作可能有效。例如,我经常对与文件系统布局(/ ajs /)无关的所有角度路由使用公共前缀。如果你能做到

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

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

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

那就是说,之前我还没有看过目录/回退方法,所以我有兴趣探索它,因为我需要的唯一重写是角度前进。谢谢!

答案 3 :(得分:0)

这是Scott Ferguson的优秀答案的略微变化和阐述。我发现使用<Location>指令比<Directory>更容易。 <Directory>指令采用绝对路径名,在不同的机器中可以有所不同。

因此,假设您的Angular应用index.html位于您的网络服务器的文档根目录下的my-app/index.html中。并且您希望使用http://localhost/my-app访问该应用。

首先确保你的基础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>

答案 4 :(得分:0)

在我的生产服务器上:

<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”之前的错误。