Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache .htaccess帮助,用于RESTful API系统的URL重写_Apache_.htaccess - Fatal编程技术网

Apache .htaccess帮助,用于RESTful API系统的URL重写

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]/

我正在为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]/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是否不是已经可以解决这个问题。。。