htaccess - 将 API 请求重写为“api.php”,并将其他请求重写为“web.php”

问题描述 投票:0回答:2

我正在 Apache 服务器和 PHP 上测试一些东西。在我的项目的根源,我有这个

.htaccess
配置文件:

RewriteEngine On
RewriteBase /react/

# API requests
RewriteCond %{REQUEST_URI} ^/react/api/
RewriteRule ^api/(.*)$ routes/api.php?controller=$1 [QSA,L]

# Non-API requests
RewriteCond %{REQUEST_URI} !^/react/api/
RewriteRule ^(.+)$ routes/web.php?controller=$1 [QSA,L]

我想将以

api
开头的请求重定向到
api.php
,将其他请求重定向到
web.php
。但是,在当前配置下,所有请求都将被重定向到
web.php
。我无法确定问题所在。请帮助我。

(抱歉,如果我的文字中有任何错误;我的英语不流利。)”

我尝试了很多事情,例如我这样做了:

RewriteEngine On
RewriteBase /react/

# API requests
RewriteCond %{REQUEST_URI} ^/react/api/
RewriteRule ^api/(.*)$ routes/api.php?controller=$1 [QSA,L]

# Non-API requests
RewriteCond %{REQUEST_URI} !^/react/api/
RewriteRule ^([^/]+)$ routes/web.php?controller=$1 [QSA,L]

这有效,但是当我有这种 URL 时

localhost/react/client/something
它不起作用。

php regex apache .htaccess mod-rewrite
2个回答
0
投票

我知道我必须修改我的正则表达式

我做到了并且有效

RewriteEngine On
RewriteBase /react/

# API requests
RewriteRule ^api/(.*)$ routes/api.php?controller=$1 [QSA,L]

# Non-API requests
RewriteRule ^(?!.*api).*$ routes/web.php [QSA,L]

0
投票
# Non-API requests
RewriteCond %{REQUEST_URI} !^/react/api/
RewriteRule ^([^/]+)$ routes/web.php?controller=$1 [QSA,L]

这有效,但是当我有这种 url 'localhost/react/client/something' 时它不起作用

因为正则表达式

^([^/]+)$
仅匹配具有单个路径段的 URL。例如。
/foo
/bar
,但不是
/foo/bar
/client/something
(您的示例)。

它也与目录本身不匹配(空 URL 路径),因此对

localhost/react/
的请求也会失败。

但是,您确实需要一个附加规则(或条件)来防止重写引擎进行额外的传递。或者使用

END
标志 (Apache 2.4) 而不是
L
。如果没有这个,重写引擎的额外循环会导致:

  1. 请求被第二次重写为
    routes/web.php
    ,此时重写引擎终止。
  2. 或者,对
    routes/api.php
    的重写请求最终会在第二遍期间被重写为
    roues/web.php

例如,使用如下所示的内容:

# /react/.htaccess

RewriteEngine On

# Fail early if "api.php" or "web.php" already requested
RewriteRule ^routes/(api|web)\.php$ - [L]

# API requests
RewriteRule ^api/(.*) routes/api.php?controller=$1 [QSA,L]

# Non-API requests
RewriteRule (.*) routes/web.php?controller=$1 [QSA,L]

(不过,从您现有的答案来看,第二条规则不需要

controller=$1
查询字符串。在这种情况下,也不需要
QSA
标志,因为默认情况下会传递查询字符串。 )

另请注意,由于

.htaccess
文件似乎位于
/react
子目录中,因此不需要
RewriteBase
指令。

但是,另一个问题是所有静态资源(CSS、JS、图像等)也将被重写为

web.php
,除非它们完全托管在其他地方?

© www.soinside.com 2019 - 2024. All rights reserved.