允许 .htaccess 中的目录

允许 .htaccess 中的目录

我已在文件夹 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不包含rquestURL 参数 - 所以这些似乎只会导致 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”文档时进行不必要的文件系统检查。

相关内容