.htaccess 无法访问Apache服务器中的主页以外的任何页面

uklbhaso  于 2022-11-16  发布在  Apache
关注(0)|答案(2)|浏览(201)

我创建了一个小的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。
我完全迷失在我做错了什么,似乎不能在网上找到任何解决方案,所以任何帮助将不胜感激。

toe95027

toe950271#

好吧,我终于找到了一个适合我的解决方案:
我将htaccess文件的前半部分替换为以下内容(并去掉了Require all granted):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
</IfModule>

它终于似乎工作,Apache不火403或404错误了!

hsgswve4

hsgswve42#

您需要配置回退到索引文件的重写规则
Angular的官方文档中有关于如何为主流网络服务器做这件事的例子。
医生;
.htaccess中,您需要实现回退到索引文件的规则:

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

相关问题