如何重写规则在apache的WordPress的json API v1和v2

7uhlpewt  于 2022-12-17  发布在  WordPress
关注(0)|答案(1)|浏览(167)

我正试图开发一个与WordPress作为无头CMS的vuejs前端网站。
到目前为止一切都很好,但有一件事让我担心。
前端位于domain.com/index.html,因此我将wordpress根文档index.php重命名为_index.php。

RewriteRule ^wp-json/(.*) /_index.php [L]

到apache .htaccess文件以重定向调用。
但是,如果我现在还想使用?json=调用旧的json API,

RewriteRule ?json(*) /_index.php [L]

RewriteRule ^?json=(.*) /_index.php [L]

不起作用。
我怎么能同时使用这两个API,不知道为什么rewriteRule不起作用。
我的就是这个样子

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
   RewriteBase /
   RewriteRule ^wp-json/(.*) /_index.php [L]
   #RewriteRule ^?json(*) /_index.php [L]
   RewriteRule ^index\.html$ - [L]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule . /index.html [L]
</IfModule>

顺便问一下:json API V2是否有办法将页面递归地输出为父/子树?

elcex8rz

elcex8rz1#

所以我将wordpress根文档重命名为index.php
为什么?如果您在请求根目录时遇到index.php优先级问题,请重置DirectoryIndex。例如:

DirectoryIndex index.html

现在,当请求目录时,只检查index.html(之前可能设置为类似DirectoryIndex index.php index.html的值,因此index.php优先)。

RewriteRule ^?json=(.*) /_index.php [L]

RewriteRulepattern 仅与URL路径匹配,特别是不包括查询字符串。要匹配查询字符串,您需要使用单独的 conditionRewriteCond指令)并检查QUERY_STRING服务器变量。
例如:

RewriteCond %{QUERY_STRING} ^json=
RewriteRule ^$ index.php [L]

正则表达式^$确保只匹配对文档根的请求,而不匹配任何URL路径。
^json=与任何以 * json= * 开头的查询字符串匹配。(.*)部分不是必需的。QUERY_STRING服务器变量不包括?分隔符本身。
注意:regex ?json(*)(在第一个示例中)无效,您希望得到500响应(如果在Apache上),因为regex将无法编译。

  • substitution* 字符串上的/前缀不是必需的,应该避免使用(这里使用了RewriteBase指令,实际上这里并不需要)。

所以,总的来说,它看起来像这样,有一些小的调整:

# Limit the directory index to "index.html" only
DirectoryIndex index.html

RewriteEngine On

# Pass Authorization header to backend on CGI
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Stop early if the front-controllers are already reached
RewriteRule ^index\.(html|php)$ - [L]

# WordPress API
RewriteRule ^wp-json/ index.php [L]
RewriteCond %{QUERY_STRING} ^json=
RewriteRule ^$ index.php [L]

# VueJS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.html [L]

相关问题