【问题标题】:How to redirect all API requests using .htaccess, while keeping asset requests intact?如何使用 .htaccess 重定向所有 API 请求,同时保持资产请求完整?
【发布时间】:2013-11-24 03:50:04
【问题描述】:

TL; DR:如果在 URL 中找到 api,我想点击 index-api.php 文件,然后简单地将所有其他请求指向 site/dist 目录,就好像它是站点的“根”一样。

所以,我在这方面花费了太多时间,相信我,我已经挖掘了 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 并保持不变:

index-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 请求会按预期正常工作,所以我知道我已经接近了。

有什么建议吗?

感谢任何人对此的帮助,这真的很混乱!

【问题讨论】:

  • 理论上,它应该可以工作,但我相信 WordPress 会让所有请求都通过它自己的路由器页面。我会考虑使用RewriteCond 作为第二条规则,但我对 Wordpress 的了解非常有限,我不确定这是否能完成任何事情:pastebin.com/sn9pt4VS
  • @Sumurai8 所以,暂时忽略 WordPress。如何将所有对 /api/ 的请求指向一个文件,然后让另一个 site/dist 目录充当所有其他请求的“根”?
  • 你看过 pastebin 了吗?
  • @Sumurai8 我做到了,但这就是问题所在。使用您的示例,我对位于 /site/dist 目录中的资产的重定向不会显示,这是有道理的,因为所有请求都被推送到该 index.html 文件。我想我更好奇我是否可以简单地让所有请求“认为”/site/dist 是站点根目录,因此对images/test.jpg 的请求实际上会从/site/dist/images/test.jpg 中提取。这有意义吗?这甚至可能吗?
  • 我已经添加了我认为您想要的答案。您可能还需要排除 /index.php 或 wordpress 在最后一条规则中使用的任何内容。

标签: php wordpress .htaccess angularjs mod-rewrite


【解决方案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,以便更好地了解如何使用它以及在重写 url 时可以使用哪些东西。

【讨论】:

  • 谢谢@Sumurai8,我会看看这个!
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2017-01-06
  • 2019-02-27
  • 2016-11-30
  • 2012-11-16
相关资源
最近更新 更多