Redirect NGINX中的重定向和重写

Redirect NGINX中的重定向和重写,redirect,nginx,webserver,rewrite,Redirect,Nginx,Webserver,Rewrite,我正在尝试创建一个简单的Hello World,比如API,为此我需要一个规则来重定向/重写URL到我的API 假设我的文件名为index.php,所以每当我访问index.php时,我都会得到一个项目列表 我要做的第一件事是将URL mydomain.com/index.php重定向到mydomain.com/api 其次,当访问mydomain.com/api时,我希望服务器在不重写URL的情况下触发index.php文件 我当前的代码如下所示: location /api { re

我正在尝试创建一个简单的Hello World,比如API,为此我需要一个规则来重定向/重写URL到我的API

假设我的文件名为index.php,所以每当我访问index.php时,我都会得到一个项目列表

我要做的第一件事是将URL mydomain.com/index.php重定向到mydomain.com/api

其次,当访问mydomain.com/api时,我希望服务器在不重写URL的情况下触发index.php文件

我当前的代码如下所示:

location /api {
    rewrite ^ $scheme://$host/index.php permanent;
}

location /index.php{
    return 302 www.mydomain.com/api;
}
rewrite ^/api\?(.+)$ /index.php?$1 last;
但它并没有像预期的那样工作。为什么以及如何修复它

# you don't need a rewrite. Use location with the "=" or exact match
location = /api {
    alias /path/to/root;
    index index.php;
}

location /index.php {
    return 302 www.mydomain.com/api;
}
希望能有帮助

以下是我的答案的第二个版本,使用了一个重定向和一个别名:


我的第一个解决方案没有转发args。阅读@alexandernst solution可以更好地理解这个问题。

你需要两条规则来实现你的目标

第一个将接收请求并将其转换为您的under-The-hood脚本的脚本应如下所示:

location /api {
    rewrite ^ $scheme://$host/index.php permanent;
}

location /index.php{
    return 302 www.mydomain.com/api;
}
rewrite ^/api\?(.+)$ /index.php?$1 last;
至于第二个,应该将所有用户重定向到美丽的URL:

rewrite  ^/index.php\?(.*)$    /api?$1    permanent;
请注意,第二条规则应该在任何位置块之外,并且在任何位置块之前,因为您愿意在任何其他位置块之前重定向用户


干杯

所以,如果我想访问/index.php writing/api,我必须使用:location=/api{alias/;index index.php;}它不起作用。。它转到/api/并给我一个404搜索/api/index.php?你在访问日志上看到了什么?它在您的文件系统上寻找哪个路径?当我访问www.mydomain.com/api时,chrome网络日志告诉我www.mydomain.com/api永久性地将301移动到了www.mydomain.com/api/,然后抛出404错误。这意味着该目录上没有index.php。如果您尝试www.mydomain.com/api/index.php,它将显示相同的消息。访问日志显示了文件系统路径,它正在尝试访问。我的api目录dosent存在,我想访问根目录中的index.php,在url/api中写入,反之亦然,将url重写为/api,但留在index.phpExactly正是我要找的!谢谢条件组和捕获组存在问题。这个应该跟在捕获组后面:最后重写^/api.+?$/index.php?$1;重写^/index.php.*?$/api?$1永久@Alfredoa不,事实上,它应该在组之前,因为它匹配的是文字字符?,而不是使index.php之后的任何内容都是可选的。@alexandernst您在第一个表达式上连续匹配“i”,在第二个表达式上连续匹配“p”。检查^2Fapi%28.%2B%29%3F%24和^2Fapi%3F%28.%2B%29%24@alfredocambera啊,真的。所以在解析我的答案时删除了转义字符。将立即编辑