我正在 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
它不起作用。
我知道我必须修改我的正则表达式
我做到了并且有效
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]
# 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
。如果没有这个,重写引擎的额外循环会导致:
routes/web.php
,此时重写引擎终止。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
,除非它们完全托管在其他地方?