我已在文件夹 API 中安装了此 .htaccess 文件。它用于将所有请求重定向到 api.php 脚本。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,NC,L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ api.php [QSA,NC,L]
RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^(.*)$ api.php [QSA,NC,L]
</IfModule>
现在,我为我的 API 添加了一些 Swagger 文档,需要能够使用此 URL 访问它:localhost/API/Swagger/ui
。当我尝试访问该 URL 时,我总是收到 404 错误。
目前使用 WAMP 进行设置,但一旦我完成所有测试,就会部署到生产服务器。我可以很好地访问这样的 API 函数:localhost/API/GetMakes?year=2010
有什么想法吗?
答案1
防止 URL 被路由到你的 API 的一种方法是简单地包含一个例外/API/.htaccess
以防止将该特定的 URL 输入到您的文件中api.php
。
例如:
RewriteEngine On
# Do not send the following URL(s) to "api.php"
RewriteRule ^Swagger/ui - [L]
# YOUR CURRENT API RULES CONTINUE HERE...
因此,如果请求的 URL以。。开始 /API/Swagger/ui
然后处理停止并且不会继续执行剩余的 mod_rewrite 指令。
但是,根据您的“Swagger”URL 的路由方式以及Swagger
(和ui
)是否是物理子目录,可能会有更好的方法来执行此操作。
更新:因为从注释来看,这/API/Swagger/ui
是一个物理目录,因此,除了上述编辑文件的方法外,还有一种替代方法/API/.htaccess
是在或子目录中简单地创建一个附加.htaccess
文件并启用重写引擎。例如:/Swagger
/Swagger/ui
RewriteEngine On
默认情况下,mod_rewrite 不会被继承,因此这应该会完全覆盖与您的 API 关联的父指令。这样就避免了您必须编辑 API.htaccess
文件。
在旁边:你当前的指令确实有点奇怪。你首先路由所有请求不要映射到物理目录或文件(大小)到您的 API 脚本。但是,您还是会继续将所有请求路由到您的 API 脚本吗?
更新:我知道为什么会出现 404 错误。API 中的代码会检查名为 的查询变量
rquest
。如果不存在,则会返回 404
这进一步证实了我上面的评论。文件中的第二条和第三条规则.htaccess
不包含rquest
URL 参数 - 所以这些似乎只会导致 404?这些指令还会阻止您的“Swagger”URL 工作。
浏览了您链接的教程后,似乎.htaccess
应该删除文件中的第二条和第三条规则,因为它们似乎没有任何实际用途(除了触发 404)?这还可以解决您访问“Swagger”文档的初始问题,并避免必须包含任何“例外”或其他指令。换句话说,将文件缩减/API/.htaccess
为以下内容也应该“有效”:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,L]
然而,正如我在回答开头提到的那样,保留“例外”仍然是最佳的,因为它可以防止在访问您的“swagger”文档时进行不必要的文件系统检查。