我正在尝试同时在我的Raspberry Pi 3上的Apache中托管一个Angular应用程序和一个非常简单的单文件PHP CRUD API后端。
我想配置规则重写(通过我已启用的mod_rewrite),以首先将请求定向到已经存在的文件/目录。然后,我需要对API的请求(即~/api.php/{table}/{id}
形式的请求)被定向到PHP文件。从那时起,到其他所有地方的所有请求都应定向到Angular dist的index.html(我运行ng build
并将生成的文件放到我的服务器上,并将那些过时的文件设置为“ public”我转动车轮的几个小时)
本质上,我需要执行this,但需要执行两次:一次用于子目录,另一次用于所有其他目录。
我对Apache配置文件非常陌生(让我们看……2小时?),我敢肯定这是一件很简单的事情,但是到目前为止,我对配置工具的了解有限阻止了我提出解决方案。
任何帮助将不胜感激!
答案 0 :(得分:0)
很久以后,我终于弄清楚了。原来,我做错了几件事(如图)。
我的第一个致命的错误是我在.htaccess
文件中进行业务,这样做是错误的。我发现的第一个问题是.htaccess
文件是 bad ,应避免使用,如果可以将全局配置与<Directory "/var/www/html/..."></Directory>
语句一起使用,则应将其完全忽略。我犯的第二个错误(注意:我在发布上述问题之后犯了此错误)是.htaccess规则未应用于我假定的层次结构中;相反,实际上。实际上,较低子目录中的.Htaccess
配置文件会被较高目录的目录替代,而不是相反。
我的第二个错误实际上是我如何使用RewriteRule语句。对于只是想了解Apache而对学习其内部机制不感兴趣的其他人,请记住,通过阅读documentation,实际上可能比浪费您节省更多的时间。实际上,大多数情况都是如此。
可以找到成功的技巧的代码可以在下面找到。 (这来自/etc/apache2/sites-enabled/000-default.conf
文件,该文件通过SSH连接通过sudo nano
编辑)
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
<Directory "/var/www/html">
AllowOverride All
</Directory>
<Directory "/var/www/html/">
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !/api
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</Directory>
<Directory "/var/www/html/api/">
RewriteBase /api/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /api/api.php/$1 [L]
</Directory>
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
这会将所有非以/api/
开头的请求(例如/home
或/faq
)重定向到Angular的index.html,以及所有API请求(api/People/27
或{{ 1}})到/api/Customers
文件(位于api.php
中)。
编辑:偶然地,我发现上述代码存在问题,该代码未将实际URL转发给/api/api.php
来使其发挥作用。已通过与api.php
匹配并使用^(.*)$