nginx 重写 Lithium PHP 框架的规则

nginx 重写 Lithium PHP 框架的规则

我一直尝试运行lithiumNginx,但没有成功。目录结构lithium如下

lithium
  |-> app libraries .htaccess
      |-> webroot .htacess --other directories
           |-> index.php .htaccess --other files

我将lithium文件夹复制到我的/var/www/。锂的路径是/var/www/lithium/

现在我在我的nginx.conf

server {
        listen       80;
        server_name  localhost;
        root /var/www/;

    location /lithium {
       rewrite ^/$ /app/webroot/ break;
       rewrite ^(.*)$ /app/webroot/$1 break;
    }

    location /lithium/app {
       rewrite ^/$ /webroot/ break;
       rewrite ^(.*)$ /webroot/$1 break;
     }

    location /lithium/app/webroot {
       if (!-e $request_filename){
        rewrite ^(.*)$ /index.php?url=$1 break;
        }
     }
 ...then my php and other configurations

但是 nginx 总是抛出404错误。为什么会这样?

我也尝试过

server {
            listen       80;
            server_name  localhost;
            root /var/www/;

location /lithium {
        if (!-e $request_filename) {
            rewrite ^/lithium/(.+)$ /lithium/app/webroot/$1 last;
            break;
            }
        }

        location /lithium/app/webroot {
        if (!-e $request_filename) {
            rewrite ^/lithium/app/webroot/(.+)$ /lithium/app/webroot/index.php?url=$1 last;
            break;
        }
    }
...then my php and other configurations

但又出现了404错误。

编辑

作为建议我把服务器的根目录改成了/var/www/lithium/app/webroot这样,我的 nginx 配置如下所示

server {
        listen   80;
        server_name localhost;

        root   /var/www/lithium/app/webroot;
        access_log /var/log/lithium/access.log;
        error_log /var/log/lithium/error.log warn;

        index  index.php index.html;

        try_files $uri $uri/ /index.php?$args;

        location ~ \.php$
        {
          .. ...
           ......

}

现在我可以看到 lithium 的主页,但是当我转到 lithium 的测试仪表板时,它http://localhost/test再次显示 lithium 的主页而不是测试仪表板。当我使用 apache 并转到 url 时,http://localhost/test它显示了test dashboard。因此,nginx 重写规则仍然不完全正确。如果我指向,rootlithium's webroot无法访问我的其他目录/var/www/

再次编辑

这是我的完整服务器块

server { 
    server_name  lithium;
    root   /var/www/lithium/app/webroot;
    access_log  /var/log/nginx/lith.access.log;
    error_log   /var/log/nginx/lith.error.log;

    listen       127.0.0.2:80;
    rewrite_log on;

    # rewrite rules for lithium
    location / {
            index  index.php index.html;

            try_files $uri $uri/ /index.php?url=$uri&$args;
    }


    location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            #include /etc/nginx/fastcgi_params;
            fastcgi_param SERVER_NAME $host;
    }

    location ~ /\.ht {
            deny  all;
    }
}

我使用 php 5.4.3。作为 php-fpm。我尝试按照 lithium 官方网站上提到的方法操作这里但我不明白这句话

cp -f sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

指的是哪个位置sapi?有什么想法吗?

答案1

只需使用 指向 webroot 就会更简单root /var/www/lithium/app/webroot

或者您可以执行以下操作。

root /var/www

然后使用try_files而不是 uglyif的:

index  index.php index.html;

location ~ \.php$ {
    ...
}

location lithium/app/webroot/ {
    try_files $uri $uri/ /lithium/app/webroot/index.php?$args;
}

location /lithium/app/ {
    rewrite ^/lithium/app/(.*)$ /lithium/app/webroot/$1;
}

location /lithium/ {
    rewrite ^/lithium/(.*)$ /lithium/app/webroot/$1;
}

location / {
    rewrite ^(.*)$ /lithium/app/webroot/$1;
}

不要忘记保护其他目录。

答案2

try_files $uri $uri/ /index.php?$args;

您没有将 URI 传递给 Lithium - 您正在附加查询字符串,该字符串为空。您可能需要以下内容:

try_files $uri $uri/ /index.php?url=$uri&$args;

假设 Lithium 期望被调用index.php?uri=/test(这是您最初的配置所暗示的)。

编辑: 这锂维基确实建议顶部try_files行,这意味着它检查 FastCGI 变量来确定要提供的 URL。

答案3

我认为您没有正确设置路径。尝试运行基本的 nginx 配置:http://lithify.me/docs/manual/configuration/servers/nginx.wiki

启用 php 错误也会有所帮助。除非启用 php 错误,否则诸如设置锂库路径之类的配置错误并不明显。

答案4

#include /etc/nginx/fastcgi_params;

您没有包含设置传递给 PHP 的大多数 FastCGI 变量的配置文件,因此 Lithium 可能无法确定正在请求哪个 URL。取消注释此行并将其移至该SCRIPT_FILENAME行上方,以便您的块如下所示:

location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SERVER_NAME $host;
}

相关内容