0

有以下目录结构:

/
  /.htaccess
  /serve
    /public
      /index.php
  /web
    /dist
      /index.html
      /.htaccess

需求如下:

  • 所有 /api 开头的请求,都重写至 /serve/public/index.php 文件
  • 所有非 /api 开头的请求重写至 /web/dist/index.html

以下是根目录的 .htaccess 文件内容,总共分为两段

RewriteEngine On
Options +FollowSymlinks -Multiviews

# 将所有 `/api*` 的请求重写到后端 `index.php`
# 其他所有请求重写到 `/web` 目录,再由 web 目录的 `.htaccess` 将所有请求重写至 index.html

RewriteCond %{HTTP_HOST} ^nbw\.cc [NC]
RewriteRule ^api/?(.*)$ serve/public/index.php/$1 [QSA,PT,L]

RewriteCond %{HTTP_HOST} ^nbw\.cc [NC]
RewriteCond %{REQUEST_URI} !^api
RewriteRule ^(.*) web/dist/$1 [QSA,PT,L]

所有非 /api 开头的请求都重写到 /web/dist 目录了,剩下的交给目录下的 .htaccess 文件进行处理,以下是 /web/dist/.htaccess 的内容:

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule .* index.html [QSA,PT,L]
</IfModule>

现在问题是我尝试访问了以下几个URL,返回的结果都是 index.html 的内容:

  1. nbw.cc:81 // 预期结果
  2. nbw.cc:81/aaa // 预期结果
  3. nbw.cc:81/api/user/userinfo // 非预期结果

第三条按道理返回的内容应该是交由 index.php 进行处理,但最终却响应到了 /.htaccess 的第二段规则了。

clipboard.png

我在 https://htaccess.madewithlove.be/.htaccess 规则进行了测试,结果正是我想要的,可是实际却并不生效,下面是测试结果:

clipboard.png

所以在这里请教一下各位为什么会出现这个问题呢,我已经尝试了很多遍,以下是我尝试过的:

  • 有无 <IfModule mod_rewrite.c> 都不会影响响应的结果
  • 在第一段增加了 RewriteCond %{REQUEST_URI} ^/?api 并不起作用
  • 第二段中有无 RewriteCond %{REQUEST_URI} !^api 结果都一直,并且我尝试了 RewriteCond %{REQUEST_URI} !^/?api 也没有解决我的问题
  • 所有关于 api 的部分,都尝试过了 ^/api ^/?api ^api,最终都不起作用
  • 在第一部分的 RewriteRule 前面插入一行 RewriteRule ^ http://www.baidu.com/?r=%{HTTP_HOST} [R=302,L] 是可以成功跳转生效的
Richex 10
2019-06-11 提问
1 个回答
0

已采纳

经过无数次尝试,我找到了解决办法,添加一个 .htaccess 文件,位置为 /serve/.htaccess,而内容只需要下面两行即可:

Options +FollowSymlinks -Multiviews
RewriteEngine On

至于为什么我也不清楚,如果有人知道的还望不吝赐教。

撰写答案

推广链接