将Apache请求从某个URL目录下定向到一个文件,将所有其他请求定向到另一个文件

时间:2018-07-05 16:18:09

标签: php angular apache

我正在尝试同时在我的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小时?),我敢肯定这是一件很简单的事情,但是到目前为止,我对配置工具的了解有限阻止了我提出解决方案。

任何帮助将不胜感激!

1 个答案:

答案 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匹配并使用^(.*)$

对重定向规则的答案进行了更正。