0

我的站点在 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.* 部分。经过我的研究和研究,我想出了:

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

我对此完全是个菜鸟,甚至想知道我是否接近完成这种转换为工作。请帮忙。

谢谢你。

4

1 回答 1

2

甚至想知道我是否接近完成这种转变为工作

您在 Nginx 中使用的方法基本上是错误的。

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

您的块mySubfolder应该如下所示:

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

你实际上并没有重写任何东西——你只是告诉 nginx 任何以 /MySubfolder 开头的请求都应该由try_files. 顺便说一句,您必须告诉 Nginx 传递正在args执行的查询字符串。

$_SERVER['REQUEST_URI']您可以附加原始 URL(我认为),尽管在脚本中使用它可能更容易。

我相信您对相同起始 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;

使外部 URL 看起来不错。但是它们都由 location 块提供服务:

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 重写,因为它们是在遇到位置块之前完成的。

于 2013-04-19T00:14:27.620 回答