Apache .htaccess帮助,用于RESTful API系统的URL重写
我正在为MyBB编写一个RESTful API系统,我已经完成了它,我知道的大多数API都是用来更新的,以生成更好的API版本,如:Apache .htaccess帮助,用于RESTful API系统的URL重写,apache,.htaccess,Apache,.htaccess,我正在为MyBB编写一个RESTful API系统,我已经完成了它,我知道的大多数API都是用来更新的,以生成更好的API版本,如: - https://api.example.com/v1 - https://api.example.com/v2 因此,我计划为同一域下的每个API版本使用一个PHP文件,例如: - api.example.com = [webroot] - API v1: - [webroot]/v1.php - [webroot]/
- https://api.example.com/v1
- https://api.example.com/v2
因此,我计划为同一域下的每个API版本使用一个PHP文件,例如:
- api.example.com = [webroot]
- API v1:
- [webroot]/v1.php
- [webroot]/apifiles/v1 (files required for the API to work)
- API v2:
- [webroot]/v2.php
- [webroot]/apifiles/v2 (files required for the API to work)
所有[apifiles]都是通过对应于该版本的PHP文件访问的
事实上,当我试图编写.htaccess文件,让用户在编写URL时直接访问v[#]php文件时,如下所示:
https://api.example.com/v1/authenticate?output=[output]&apikey=[apikey]&username=[username]&password=[password]
如果未正确接收参数,则会抛出API通常会显示的错误:
https://api.example.com/v1.php/authenticate/?apikey=[apikey]&output=[output]&username=[username]&password=[password]
Answer: {"uid":"[uid]","username":"[username]",...}
- 正确写入URL:
https://api.example.com/v1.php/authenticate/?apikey=[apikey]&output=[output]&username=[username]&password=[password] Answer: {"uid":"[uid]","username":"[username]",...}
- URL缺少参数:
https://api.example.com/v1.php?apikey=[apikey]&output=[output]&username=[username]&password=[password] Answer: {"error":"You don't have permission to access this page."}
v1.php
文件和?
之间的/authenticate/
字符串。此字符串可以根据用户希望对API执行的操作(身份验证、联机、权限等)进行更改,这取决于此字符串将取决于传递的参数数量
我尝试了一些方法,甚至在互联网上搜索了所有答案,但找不到一个真正对我有帮助的答案。他们帮助我了解了.htaccess文件的工作原理。主要帮助我的是:
作者建议使用以下工具:
我当前的.htaccess文件包含以下内容:
Options +FollowSymLinks
<IfModule mod_rewrite.c>
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^v(\d+)\/([a-z]+)?(.*)$ ./v$1.php/$2/?$3 [L,QSA,NC]
</IfModule>
Options+FollowSymLinks
#打开mod_rewrite
重新启动发动机
重写基/
重写cond%{SCRIPT_FILENAME}-D
重写cond%{SCRIPT_FILENAME}-F
重写规则^v(\d+)\/([a-z]+)?(.*)$./v$1.php/$2/?$3[L,QSA,NC]
但它不起作用,即使在我研究之后,我也不知道如何让它起作用。提前感谢。经过大量的研究、尝试和时间,我得出了一个结论,即不可能混合使用
$\u服务器['PATH\u INFO']
使用@CBroe建议的URL重写
。使用/foo.php/something
您将依赖路径信息-但不确定这是否适用于内部重写。我只需重写它,以便将authenticate
关键字转换为一个附加的GET参数。@CBroe是的,它是通过PHP在API类的“\u construct()”函数中进行管理的:“$PATH=explode(“/”,$\u SERVER[“PATH\u INFO”]);”,这稍后用于加载用于管理请求的正确文件。不知何故,我需要服务器继续承认它作为PATHORY信息,但如果没有办法实现它,我会认真考虑重新编写代码。谢谢。嗯,它到底是怎么不起作用的?我的猜测是,在您重写到/vX.php/something/…
之后,在下一轮中,由于该“路径”,对现有文件夹/文件的检查可能不再有效。也许添加另一个重写条件来检查请求URI是否不是已经可以解决这个问题。。。