如何在节点服务器上使用angular运行特定的URL(而不是主页)而不进行散列?

时间:2019-11-07 05:43:16

标签: angular

我正面临与服务器上的角度路由有关的问题。我使用的URL中没有哈希(#)符号。 哈希: https://localhost:4200/#/activity-details/818659/false 没有哈希: https://localhost:4200/activity-details/818659/false

它在本地工作正常,但是在节点服务器上部署后,显示错误“无法获取/ activity-details / 818659 / false”

使用散列可以很好地工作,但是我想在URL中不使用散列。

我正在使用无哈希值: 导入:[RouterModule.forRoot(routes)]

我正在使用的哈希  导入:[RouterModule.forRoot(routes),{usehash:true}],

它在服务器端处理吗?怎么样? 路由处理吗?怎么样?

1 个答案:

答案 0 :(得分:0)

根据Angular documentation

  

已路由的应用程序必须回退到index.html
如果应用程序使用Angular路由器,则必须将服务器配置为在要求输入以下内容时返回应用程序的宿主页(index.html):它没有的文件。
静态服务器在收到http://www.example.com/的请求时,通常会返回index.html。但是除非它配置为返回index.html,否则它会拒绝http://www.example.com/heroes/42并返回404-Not Found错误。


如果您运行的是完全静态的服务器,则会生成错误,因为服务器上不存在搜索页面。例如,使用 Express.js ,您可以捕获这些请求并返回index.html文件。

app.post(...)
app.get(...)
app.use((req, res) => res.sendFile(path.join(__dirname, "public/index.html")))


静态服务器配置:

Nginx:

try_files $uri $uri/ /index.html;

Firebase托管:

"rewrites": [ {
  "source": "**",
  "destination": "/index.html"
} ]

Apache:

RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html