2013-03-07 19 views
16

显然,在整个web上有很多mod重写讨论和答案。但是,我很难抓住他们。所以我想我会在这里问。为apache 2重写规则以便与角色js一起使用

我要求重写规则做安迪乔斯林在这里评论解释说: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

我想为应用程序/ index.html的一部分,然而隐藏。

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

感谢您的任何帮助/指导。

+7

我不认为这个问题应该关闭它是关于angularjs和url-rewrite这两个主题都是相关的。 – elviejo79 2013-03-13 22:28:22

+0

这是没有意义的,这是标记为“脱离主题”。这不是主题。 – 2013-03-15 18:33:25

+0

@casperOne,请打开此备份。 – 2013-03-15 18:34:28

回答

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] 
+0

谢谢,我会尽我所能。我现在正在通过一个关于重写的流行教程。我在想,我想要做的不是仅仅因为存在就提供文件。问题是有人可能会要求什么角度调用一个'部分'文件,它会为它服务,等等。我将重定向到app/index.html然后我会明确地跳过某些目录,如css/img/ – 2013-03-08 02:36:32

+1

这段代码几乎解决了我的问题......我不得不改变应用规则一点,我离开了我的工作示例在这个答案:http://stackoverflow.com/a/15415902/54848 – elviejo79 2013-03-14 17:19:34

+0

does not for me for = (http://take.ms/DyLaQ – fdrv 2015-12-09 17:25:25

18

接受的这个问题的答案是过时的。您现在可以在Apache 2.2.16+的conf文件中使用FallbackResource指令。

FallbackResource /app/index.html 

如果你想FallbackResource指令忽略“/ API”路线:

<Directory /api> 
FallbackResource disabled 
</Directory> 
+1

保存该文件的位置,但是,如何忽略对“/ api”的请求时使用这个命令?这是我最初的问题。 – 2016-04-05 22:08:13

+1

它可以,如果你将它设置为特别忽略/ api路线。我编辑了答案来反映这一点。 – 2016-04-06 18:36:44

0

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

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

然后它会更有意义,但这似乎并不适用于我。无论后端如何,使用通用前缀还会使后端规则变得更加简单。例如,如果您不使用反向代理,则可以设置简单的服务器转发控制器。它使建模你的Apache重写规则很简单。例如:

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

这么说,我还没有看到目录/回退方法之前,让我有兴趣去探索它,当我需要的只是重写是角前进。谢谢!

0

这是斯科特·弗格森的出色答案的细微变化和细化。我发现使用<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/下的任何资源无法找到加载的index.html。

如果您在相同路径下进行API调用,例如说/my-app/api,那么您应该不会为这些调用应用FallbackResource规则。所以补充:

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