如何使用.htaccess重定向所有API请求,同时保持资产请求不变?

时间:2013-11-24 03:50:04

标签: php wordpress .htaccess angularjs mod-rewrite

TL; DR:如果在URL中找到index-api.php,我想点击api文件,但是只需将所有其他请求指向site/dist目录,就像它是'root'一样该网站。

所以,我花了太多时间来相信我,相信我,我已经挖掘了mod_rewrite的所有资源。我想我只是不太了解并想到我会在这里问。

理论上,我想做的事情似乎很简单。我正在使用Grunt构建单页应用程序(Angular App),将其输出到WordPress安装的根目录。 WordPress安装只是使用WordPress JSON API插件提供API,所以我希望网站的根目录能够点击我的Grunt目录(位于site/dist/index.html),但是所有siteurl.com/api的请求都会被点击index.php文件并正常进行。

请记住,我在此site/dist目录中有其他资源/图像,所以理想情况下,如果对网站根目录的所有请求都只是将此文件夹用作网站的“基础”,那就太棒了(例如siteurl.com/images/testimage.jpg来自site/dist/images/testimage.jpg的请求。

我觉得我在这里遇到了什么,我很惊讶我找不到任何直接解决这个问题的东西。

我现在所做的是将index.php从WordPress重命名为index-api.php并保留相同内容:

索引api.php:

<?php

define('WP_USE_THEMES', true);



/** Loads the WordPress Environment and Template */
require('./wordpress/wp-blog-header.php');
// phpInfo();

htaccess的:

<ifModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^api/(.*)$ index-api.php [L]
RewriteRule (.*)$ site/dist/index.html [L]

</ifModule>

我试图通过几个帖子试图让这个工作无数其他的努力,在我看来它应该工作正常。有趣的是,如果我注释掉最后一行RewriteRule (.*)$ site/dist/index.html [L],api请求按预期正常工作,所以我知道我很接近。

有什么建议吗?

感谢任何人的帮助,这真的令人困惑!

1 个答案:

答案 0 :(得分:1)

首先,您需要确保对/index-api.php的请求不匹配并由第二条规则重写。在第二条规则中,您可以使用$1$1将替换为第一个捕获组中匹配的内容。我们还需要确保第二条规则与重写的规则不匹配,否则我们最终会遇到无限循环和内部错误。

您也可以在第一条规则中使用$1,如下所示:

RewriteRule ^api/(.*)$ index-api.php?url=$1 [L]

RewriteCond %{REQUEST_URI} !^/site/dist/
RewriteCond %{REQUEST_URI} !^/index-api\.php
RewriteRule (.*)$ site/dist/$1 [L]

我建议您阅读mod_rewrite的the documentation,以便更好地了解如何使用它以及在重写网址时您可以使用的内容。