25

显然,整个网络上有很多关于 mod 重写的讨论和答案。但是,我很难掌握它们。所以我想我会在这里问。

我要求重写规则来做安迪乔斯林在评论中解释的事情:https ://stackoverflow.com/a/11100438

这是我当前位于 example.com 根目录的目录结构

  • 应用程序/
  • app/index.html(Angular js 应用程序的“根”)
  • api(这将是一个用于 'api' 的 symfony 2 应用程序。我将从 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 请求。

感谢任何和所有的帮助/指导。

4

5 回答 5

29

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

FallbackResource /app/index.html

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

<Directory /api>
FallbackResource disabled
</Directory> 
于 2016-04-05T20:47:38.277 回答
17

这里有一些东西可以帮助你(把它放在你的 /.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

于 2013-03-08T00:52:35.423 回答
0

这个答案的问题是您仍然需要 404 来查找文件未找到。根据人们构建前端应用程序的方式,人们让 css 或其他文件返回 404 是很常见的,尤其是当他们正在构建更大的动态应用程序或外包前端工作时。此外,角度路由通常与文件系统上的任何内容无关。如果您将其缩小到单个目录,上述方法可能会起作用。例如,我会经常为所有与文件系统布局 (/ajs/) 无关的角度路由使用一个公共前缀。如果你能做到

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

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

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

也就是说,我以前没有见过目录/后备方法,所以我有兴趣探索它,因为我需要的唯一重写是角度前进。谢谢!

于 2017-02-19T21:22:59.707 回答
0

这是斯科特弗格森出色答案的细微变化和阐述。我发现使用该<Location>指令比使用<Directory>. 该<Directory>指令采用绝对路径名,在不同的机器上可能不同。

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

首先确保你的基本href是“/my-app/”。接下来,在您的httpd.conf文件中添加:

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

/my-app/如果找不到任何资源,这将导致 Apache 加载 index.html 。

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

<Location "/my-app/api">
    FallbackResource disabled
</Location>
于 2017-12-28T18:43:52.200 回答
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”之前是不正确的。

于 2019-03-12T14:07:37.940 回答