将代码从htaccess重写为nginx配置?

时间:2013-11-16 13:21:16

标签: apache .htaccess mod-rewrite nginx

我在将htaccess文件中的重写代码实现到nginx配置时遇到问题。 我已经尝试过生成器:http://winginx.com/htaccess来生成我的重写 代码。

我的nginx配置代码:

server {
        listen 80;
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;       
}

server {
        listen 80;
        root /usr/share/nginx/www;
        index index.php;
        server_name www.example.com;
        error_page 404 http://www.example.com/404.php;
        autoindex off;
        error_log  /usr/share/nginx/www/nginx_error.log  warn;

   location / {
        rewrite ^([^\.]*)$ /$1.php;
    }

    location = / {
        rewrite ^ /index.php;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

}

我想从我的.htaccess中实现这个:

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-/_]+)$ admin/index.php?hotelname=$1&do=$2 [QSA]
RewriteRule ^(([A-Za-z0-9-/]+)+)$ admin/index.php?hotelname=$1 [L]

从工具生成代码:

location / {
  rewrite ^/([A-Za-z0-9-]+)/([A-Za-z0-9-/_]+)$ /admin/index.php?hotelname=$1&do=$2;
  rewrite ^/(([A-Za-z0-9-/]+)+)$ /admin/index.php?hotelname=$1 break;
}

我已经尝试将最后一行代码实现到我的位置块,但根本没有工作.. 每一个意见我都会非常致命! 问候 Makromat

2 个答案:

答案 0 :(得分:1)

盲目的转换将是

rewrite ^([A-Za-z0-9-]+)/([A-Za-z0-9-/_]+)$ admin/index.php?hotelname=$1&do=$2&$query_string last;
rewrite ^(([A-Za-z0-9-/]+)+)$ admin/index.php?hotelname=$1 last;

但我更愿意,如果我更多地理解这个问题,可以产生更优化的重写。

我何时知道该URL是否应该传递给/admin,请给我一个后端和前端的实际URI。

答案 1 :(得分:1)

通常使用nginx思维方式在nginx中更好地管理重写。这种新的思维方式更多地基于try_file

所以你可以尝试类似的东西(未经测试):

location ^~ "/([A-Za-z0-9-]+)/([A-Za-z0-9-/_]+)"  {
    try_files $uri admin/index.php?hotelname=$1&do=$2&$args;
}
location ^~ "(([A-Za-z0-9-/]+)+)" {
    try_files $uri /admin/index.php?hotelname=$1;
}
location = / {
    rewrite ^ /index.php;
}
location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

如果永远不会对给定的$uri进行直接访问,则从try_files中删除该部分。现在我也不确定你的第二个正则表达式(([A-Za-z0-9-/]+)+),为什么不使用:

location ^~ "/([A-Za-z0-9-/])+"

location ^~ "/([A-Za-z0-9-])+/"

所以即使在你的apache重写中,也许有些东西我看不到。