【问题标题】:In Angular, how to ignore a file using .htaccess在 Angular 中,如何使用 .htaccess 忽略文件
【发布时间】:2020-08-07 06:59:14
【问题描述】:

我正在使用 Angular 9.x。我需要忽略根目录中的特定文件。例如:

/root
   - index.html
   - ignorefile.json

我尝试向 .htaccess 添加重写规则,但没有成功。

RewriteEngine On
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_URI} !^/ignorefile\.json$ [NC] # this does not work
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . index.html [L]

如何在编译应用时忽略特定文件?

【问题讨论】:

  • Angular 是一个前端框架,即它在浏览器中运行。 .htaccess 文件用于某些 Web 服务器。文件在哪里?为什么它们是您的 Angular 项目的一部分?在构建过程中你需要它们吗?
  • @joel .htaccess 文件由 Angular CLI 自动生成。我不需要被忽略的文件成为项目的一部分,我只需要重写规则忽略它。
  • 啊,我不知道 Angular CLI 可以生成 .htaccess 文件。如何?但是您正在使用 .htaccess 文件的网络服务器上进行部署,对吗?你不能从你的应用分发中排除 ignorefile.json 吗?
  • 如果这是一个物理存在的文件,那么使用 !-f!-d 标志检查请求文件名的两个 RewriteConds 应该已经阻止以下规则进行任何重写。不确定实际问题应该出在哪里?
  • 忽略文件是什么意思?如果您输入http://example.com/ignorefile.json,您期望得到哪个结果?一个404?主页?文件本身?

标签: angular .htaccess mod-rewrite


【解决方案1】:

信息

Angular 不会生成和处理服务器端重定向。

要在 Angular 中处理从一个视图到下一个视图的导航,您可以使用 Angular 路由器。路由器通过将浏览器 URL 解释为更改视图的指令来启用导航。

当路由器导航到一个新的组件视图时,它会使用该视图的 URL 更新浏览器的位置和历史记录。由于这是一个严格的本地 URL,浏览器不会将此 URL 发送到服务器,也不会重新加载页面。

如果您在现代浏览器中使用(Angular 9 默认)PathLocationStrategy,它们支持 history.pushState,这是一种在不触发服务器页面请求的情况下更改浏览器位置和历史记录的技术。路由器可以组成一个“自然”的 URL,该 URL 与需要加载页面的 URL 没有区别。

在这种情况下,服务器需要将所有流量重定向到 index.html,以便 Angular 可以接管处理 UI 上的路径。为此,您必须将 .htaccess 文件附加到您的生产服务器以使路由工作。

回答

如果您尝试将 ignorefile.json 与您的 Angular 应用程序一起提供,这是很有可能的。你应该更新你的 angular.json 文件。

   "assets": [
     ...
     {
       "glob": "ignorefile.json",
       "input": "src/",
       "output": "/"
     },
     ...
   ]

foo.com 将加载 Angular 应用,但 foo.com/ignorefile.json 将显示 JSON 数据。

检查这个答案; https://stackoverflow.com/a/61972932/2827820

【讨论】:

    【解决方案2】:

    使用与 index.html 相同的规则,我建议添加 RewriteBase /

    RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
      RewriteCond ^ignorefile\.json$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . index.html [L]
    

    如果它不起作用 - 让它更严格

    RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
      RewriteCond ^ignorefile\.json$ - [END]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . index.html [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2011-06-20
      相关资源
      最近更新 更多