【问题标题】:mod_rewrite for REST API on PHP用于 PHP 上的 REST API 的 mod_rewrite
【发布时间】:2012-01-28 03:58:03
【问题描述】:

我希望每次通话都与

http://localhost/api/

(作为根文件夹)例如http://localhost/api/get/users实际上是http://localhost/api/index.php?handler=get/users

http://localhost/api/get/user/87 应该是 http://localhost/api/index.php?handler=get/user/87index.php 中我会捕获 $_GET 变量 handler 并以适当的方式处理它。

如果我有这种重写规则,它只适用于一个

RewriteRule ^([^/\.]+)/?$ index.php?handler=$1 [QSA,L]

两个

RewriteRule ^([^/\.]+)/?$ index.php?handler=$1 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?handler=$1&handler2=$2 [QSA,L]

三个斜线等等...

RewriteRule ^([^/\.]+)/?$ index.php?handler=$1 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?handler=$1&handler2=$2 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?handler=$1&handler2=$2&handler3=$3 [QSA,L]

所以对于第一种情况,http://localhost/api/a 可以工作,但http://localhost/api/a/b 会导致 Not Found 错误。

编辑:这样可以吗?

RewriteRule ^(.*)$ index.php?handler=$1 [L,QSA]

【问题讨论】:

    标签: php api rest mod-rewrite


    【解决方案1】:

    您的(自己的)答案应该没问题,请记住,它会将所有传入 URL 重定向到 index.php。 IE。如果您有静态文件,例如/js/jquery.js,那么它将更改为index.php?handler=/js/jquery.js

    如果您想避免出现问题,请尝试以下操作:

    RewriteCond %{REQUEST_URI} !(.*)\.(css|js|htc|pdf|jpg|jpeg|gif|png|ico)$ [NC]
    RewriteRule ^(.*)$ index.php?handler=$1 [QSA,L]
    

    两个提示:

    请尝试使用RewriteLog 指令:它可以帮助您追踪此类问题:

    # Trace:
    # (!) file gets big quickly, remove in prod environments:
    RewriteLog "/web/logs/mywebsite.rewrite.log"
    RewriteLogLevel 9
    RewriteEngine On
    

    我最喜欢的检查正则表达式的工具:

    http://www.quanetic.com/Regex(别忘了选择 ereg(POSIX) 而不是 preg(PCRE)!)

    【讨论】:

    • +1 用于跳过静态文件条件。据我所知,RewriteLogRewriteLogLevel 指令已从 Apache >= 2.4 中删除。改用LogLevel warn mod_rewrite.c:trace3 之类的东西。
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2017-06-12
    • 2013-03-16
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多