Php 如何在Nginx';重写规则是什么?

Php 如何在Nginx';重写规则是什么?,php,nginx,ubuntu-18.04,Php,Nginx,Ubuntu 18.04,我想做的是允许以下任何一项工作: site.mydomain.com/{id}?args(默认为index.php) site.mydomain.com/{id}/{any file if exists}?args(可以是calendar.php、upload.php等,如果不是,则为404) 我的Nginx配置中包含以下内容: server { listen 80; large_client_header_buffers 4 32k; server_name sit

我想做的是允许以下任何一项工作:

site.mydomain.com/{id}?args(默认为index.php)

site.mydomain.com/{id}/{any file if exists}?args(可以是calendar.php、upload.php等,如果不是,则为404)

我的Nginx配置中包含以下内容:

server {
    listen 80;

    large_client_header_buffers 4 32k;

    server_name site.mydomain.com;

    root /var/www/php/my_site/public;

    index index.php;

    access_log /var/log/sites/my_site.access.log;
    error_log /var/log/sites/my_site.error.log error;

    location / {
        rewrite ^/([0-9]+)/?$ /index.php?s=$1$is_args$args last;
        include /etc/nginx/conf.d/php.inc;
    }

    location ~ /\.ht {
        deny all;
    }
}
这是我的php.inc,我将它包含在我的位置,因此它将实际执行php而不是下载它:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;

    fastcgi_param   SCRIPT_FILENAME    $request_filename;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;

    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
当我进入
site.mydomain.com/{id}
时,它会工作

如果我在它的末尾附加
/index.php
,我会得到一个404错误,或者任何其他php文件

我需要index.php(和其他文件),因为它向后兼容旧的应用程序

我已经尝试了很多配置选项,比如SO和Google,但我似乎无法让它工作。我对nginx相当陌生,所以我有点不知所措

以下是我的目录结构(如果有帮助):

/var/www/php/my_site
    /application
    /library
    /public
        /static
            /styles
            /javascript
编辑

我尝试了以下建议的答案:

rewrite ^/([0-9]+)(/|/index.php)?$ /index.php?s=$1 break;
它也做同样的事情。我更新了我的问题,使之比以前更具体一些

可能的解决方案:

location / {
}

location ~ /\.ht {
    deny all;
}

location ~ ^/([0-9]+)($|/) {
    rewrite ^/([0-9]+)/?$ /index.php?s=$1 last;
    rewrite ^/([0-9]+)/(.*)\.php$ /$2.php?s=$1 last;
    rewrite ^/([0-9]+)/(.*)$ /$2 last;
}

location ~ \.php$ {
    try_files $uri =404;
    ...
}
最后三个
位置
块的顺序很重要

include/etc/nginx/conf.d/php.inc
已从
location/
块中移出并插入到末尾,因此它提供了顶级
location~\.php$
块,而不是嵌套的location块。我在上面的示例中显示了include文件的内容,但是您的
include
语句的工作原理完全相同

location~^/([0-9]+)($|/)
块处理以
/{id}
节开头的任何URI<代码>重写自动将原始查询字符串附加到重写的URI。有关详细信息,请参阅


您应该在
location~\.php$
块中包含
try\u files
语句,以避免在php文件不存在时发送并返回404响应。

感谢您提供的信息。我按照你的建议做了,在进入index.php时仍然得到了404。尽管没有它,它仍然可以工作。另外,我还有一些需要访问的php页面。有没有一种方法可以让php一网打尽?这里的整个想法是能够读入{id}参数,并将其传递到my main controller.php中,以识别用户您可能提供的任何其他信息?
(/|index.php)
不起作用。我还更新了我的问题,以包括所有php文件,而不是index.php。我感谢你已经给予的帮助。好的,谢谢。明天早上我要试试这个。我非常感谢你的回答,所以法蒂的工作很有魅力!!非常感谢你,你帮我省了很多麻烦。难道只有php文件有id前缀吗?您想用
s=id
参数重写这些吗?
{id}
是URL的一部分。所以:mysite.domain.com/12345/index.php或mysite.domain.com/4567/index.php(或ajax.php,info.php)。是的,这意味着12345=s=12345或s=4567,但不是静态文件?或者您希望它也从静态文件的URL中剥离,例如,
/12345/base.css
正确,使用基本URL可以很好地处理静态文件。所以我不需要这些