我创建了一个小的Angular应用程序,它可以在本地主机上完美运行,但是我不能让它在我的服务器上正常工作。每当我尝试加载主页/基本URL以外的任何其他URL时,我都会得到错误403或404,这取决于我尝试的解决方案。
这是在Centos7上运行的Apache服务器,具有以下VHosts(敏感数据(域URL、应用程序名称)已编辑):
将http重定向到https的VHost:
<VirtualHost *:80>
ServerName domain_url
ServerAlias domain_url (without www.)
DocumentRoot /var/www/MyApp/html
ErrorLog /var/www/MyApp/log/error.log
CustomLog /var/www/MyApp/log/requests.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} = domain_url [OR]
RewriteCond %{SERVER_NAME} = domain_url (without www.)
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
HTTPS虚拟主机:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName domain_url
ServerAlias domain_url (without www.)
DocumentRoot /var/www/MyApp/html
ErrorLog /var/www/MyApp/log/error.log
CustomLog /var/www/MyApp/log/requests.log combined
<Directory /var/www/MyApp/>
AllowOverride All
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/domain_url/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain_url/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain_url/chain.pem
</VirtualHost>
</IfModule>
httpd.conf文件的一些相关部分:
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory "/var/www/MyApp">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
当我只使用这些文件运行我的网站时,主页运行得很好,我的Angular 应用程序中的导航也能正常工作,但我试图加载“www.domain.com/“以外的任何URL(例如:“www.domain.com/about“)返回错误404找不到。
然后,我在“var/www/MyApp/html”中添加了以下.htaccess文件(大部分由在线htaccess生成器生成,我只添加了一个Require all granted,我甚至不知道它是否有用,我对apache配置非常陌生):
Require all granted
<IfModule mod_rewrite.c>
RewriteEngine On
# Redirection of requests to index.html
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^.*$ - [NC,L]
# Redirect all non-file routes to index.html
RewriteRule ^(?!.*\.).*$ index.html [NC,L]
</IfModule>
# Disable browser caching for all files that don't get a hash string by Angular.
<FilesMatch "^(?!.*\.([0-9a-z]{20})\.).*$">
<IfModule mod_headers.c>
FileETag None
Header unset ETag
Header unset Pragma
Header unset Cache-Control
Header unset Last-Modified
Header set Pragma "no-cache"
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Expires "Mon, 1 Jan 1900 00:00:00 GMT"
</IfModule>
</FilesMatch>
在添加了这个.htaccess之后,每当我试图加载包括我的主页在内的任何内容时,我都会收到一个错误403 Forbidden。
我完全迷失在我做错了什么,似乎不能在网上找到任何解决方案,所以任何帮助将不胜感激。
2条答案
按热度按时间toe950271#
好吧,我终于找到了一个适合我的解决方案:
我将htaccess文件的前半部分替换为以下内容(并去掉了Require all granted):
它终于似乎工作,Apache不火403或404错误了!
hsgswve42#
您需要配置回退到索引文件的重写规则
Angular的官方文档中有关于如何为主流网络服务器做这件事的例子。
医生;
在
.htaccess
中,您需要实现回退到索引文件的规则: