我的网站在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;
}
}
我是一个完整的菜鸟,甚至想知道我是否接近完成转换工作。请帮忙。
谢谢。
答案 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重写,因为它们是在遇到位置块之前完成的。