apache htaccess 重写路径的一个问题
有以下目录结构:
/
/.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
的内容:
nbw.cc:81
// 预期结果nbw.cc:81/aaa
// 预期结果nbw.cc:81/api/user/userinfo
// 非预期结果
第三条按道理返回的内容应该是交由 index.php
进行处理,但最终却响应到了 /.htaccess
的第二段规则了。
我在 https://htaccess.madewithlove.be/ 对 .htaccess
规则进行了测试,结果正是我想要的,可是实际却并不生效,下面是测试结果:
所以在这里请教一下各位为什么会出现这个问题呢,我已经尝试了很多遍,以下是我尝试过的:
- 有无
<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]
是可以成功跳转生效的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
经过无数次尝试,我找到了解决办法,添加一个
.htaccess
文件,位置为/serve/.htaccess
,而内容只需要下面两行即可:至于为什么我也不清楚,如果有人知道的还望不吝赐教。