Apache mod_rewrite到Nginx重写规则

时间:2013-04-18 16:42:24

标签: apache mod-rewrite nginx

我的网站在Nginx上运行,我正在尝试在使用Apache的mod_rewrite规则的网站的子目录中添加软件。例如。 www.mydomain.com/mySubfolder

这是Apache .htaccess

#Options -Indexes
<ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/system.*
    RewriteRule ^(.*)$ index.php?/$1 [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php?/$1 [L]
</ifModule>

到目前为止,我设法让主页工作,但在请求登录页面时,它会导致URL重定向循环。例如。 www.myDomain.com/login 有了这个:

location /mySubfolder {
if (!-e $request_filename) {
rewrite ^(.*)$ /mySubfolder/index.php?q=$1 last;
break;
}
}

我一直在阅读并尝试学习如何将Apache转换为Nginx,甚至使用我在http://winginx.com/htaccess找到的.htaccess到Nginx转换器,但该工具似乎无法识别%{REQUEST_URI} ^ / system。* part。经过我的研究和研究,我提出了:

location /mySubfolder {
if ($request_uri ~ "^/(system.*)$") {
rewrite ^/(.*)$ index.php?/$1 last;
}
if (!-e $request_filename) {
rewrite ^(.+)$ /mySubfolder/index.php?q=$1 last;
break;
}
}

我是一个完整的菜鸟,甚至想知道我是否接近完成转换工作。请帮忙。

谢谢。

1 个答案:

答案 0 :(得分:2)

  

甚至想知道我是否接近完成转换   工作

你基本上采用了错误的方法在Nginx中使用。

虽然假设Apache中的重写规则将映射到Nginx中的重写是很自然的,但事实并非如此。相反,它们主要映射到位置规则。

mySubfolder的阻止应为:

location ^/mySubfolder {
    try_files /mySubfolder/index.php?$args =404;
}

您实际上并没有重写任何内容 - 您只是告诉nginx,任何以/ MySubfolder开头的请求都应该由try_files中列出的文件提供服务。顺便说一句,你必须告诉Nginx传递查询字符串,args正在做什么。

您可以附加原始网址(我认为)虽然在您的脚本中使用$_SERVER['REQUEST_URI']可能更容易。

我相信你对同一个起始URI的重写规则会导致/ mySubFolder保持匹配。

在Nginx中,仅当您希望外部URL路径由不同的内部URL提供服务时才使用重写,并且通常重写规则不在位置块内。

例如,我有一个文件服务器,用于提供图像和其他文件。我在服务器块中有这些重写规则:

rewrite  ^/image/(\d+)/(\w+)/(.+)\.([^\.]*)$ /proxy/proxyImage.php?typeID=$1&mode=$2&imagePath=$3.$4&resizeAllowed=TRUE&type=image last;
    rewrite  ^/image/(\d+)/(.+)\.([^\.]*)$ /proxy/proxyImage.php?typeID=$1&imagePath=$2.$3&resizeAllowed=TRUE  last;
    rewrite  ^/file/(\d+)/(.+)\.([^\.]*)$ /proxy/proxyFile.php?typeID=$1&imagePath=$2.$3&resizeAllowed=FALSE last;

使外部网址看起来不错。但随后它们都被位置块所服务:

location ~* ^/proxy  {
        try_files $uri =404;
        fastcgi_pass   unix:/opt/local/var/run/php54/php-fpm-images.sock;
        include       /documents/projects/intahwebz/intahwebz/conf/fastcgi.conf;
    }

位置块不需要知道URL重写,因为它们是在遇到位置块之前完成的。