Nginx 重写,来自 htaccess-files

Nginx 重写,来自 htaccess-files

我在这个目录树中建立了一个 PHP 项目:

  • 项目
    • v1
      • 应用程序(项目文件)
      • 民众
        • index.php(应用程序控制器)
        • 文档
          • php 文件
        • 例子
          • php 文件

“项目”是网络服务器的根。

我想跳过 URL 的“public”部分,但保留“v1”:

http://myserver.com/v1/whatever/1

并不是

http://myserver.com/v1/public/whatever/1

我通过这个让它工作了:

rewrite ^(.*)$ /v1/public/index.php?_url=/$1;

我也希望能够提供里面的文件“文档”“例子”通过以下 URL 结构:

http://myserver.com/v1/documentation/file_name.php
http://myserver.com/v1/examples/file_name.php

我使用这两个 .htaccess 文件在 Apache 中运行它:

#/项目/v1/.htaccess

RewriteEngine 开启
重写规则 ^$ public/ [L]
重写规则(.*)公共/$1 [L]
#/项目/v1/公共/.htaccess

重写引擎开启
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
重写规则 ^(.*)$ index.php?_url=/$1 [QSA,L]

我尝试将这些设置转换为 Nginx,但失败了。结果如下:

server {
    listen   80;
    server_name mysite.com;

    index index.php index.html index.htm;
    set $root_path '/var/www/html/project';
    root $root_path;

    try_files $uri $uri/ @rewrite;

    location @rewrite {
        rewrite ^(.*)$ /v1/public/index.php?_url=/$1 break;
    }

    location ~ \.php {
        fastcgi_pass 127.0.0.1:9000;
        #fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index /index.php;

        include /etc/nginx/fastcgi_params;

        fastcgi_split_path_info       ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
        root $root_path;
    }

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

答案1

首先,你不需要location ~* ^/(css|img|js|flv|swf|download)/(.+)$块,因为它不会改变任何东西。另外,一般来说,块root内的目录location不是你通常想要的,alias而是你最可能想要的。

但对于实际问题,请尝试添加以下位置块:

location /v1/documentation/ {
    rewrite ^/v1/documentation/(.+)$ /v1/public/documentation/$1 last;
}

location /v1/examples/ {
    rewrite ^/v1/examples/(.+)$ /v1/public/examples/$1 last;
}

@rewrite针对您的区块的可选优化

location @rewrite {
    rewrite ^ /v1/public/index.php?_url=$uri break;
}

相关内容