我正在尝试将旧应用程序从 apache 移动到 nginx,但在这里我停滞了。
这/.htaccess
RewriteEngine on
RewriteRule ^(.*) public/$1 [L]
这/public/.htaccess
Options +Indexes +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
结构非常简单。这款应用有
./application
./*back-end*
./vendor
./*back-end includes*
./public
./public/.htaccess <- this one
./*front-end*
./tests
./.htaccess <- this one
我让它工作的唯一方法是将服务器更改root
为./public
并添加
location / {
if (!-d $request_filename){ set $rule_0 1$rule_0; }
if (!-f $request_filename){ set $rule_0 2$rule_0; }
if ($request_filename !~ "-l"){ set $rule_0 3$rule_0; }
if ($rule_0 = "321"){
rewrite ^/(.+)$ /index.php?url=$1 last;
}
} #from winginx convertor
但这样一来,我的./public
文件夹外部就被遗漏了,应用程序就坏了。所以我正在寻找一种不排除后端文件夹的方法来重写它。
答案1
重置文档root
返回顶部。 尝试这个:
location / {
try_files $uri $uri/ @public;
}
location @public {
rewrite ^ /public$request_uri last;
}
location /public {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /public/index.php?url=$1 last;
}
第一个和第二个位置块将为后端文件提供服务,并确保其他任何内容都被重写入文件/public
夹(您的第一个.htaccess
规则集)。
第三和第四个位置块将提供来自公共文件夹的文件(如果存在),否则调用脚本/public/index.php
。
我认为你已经有一个PHP 位置块。
上述操作可能有些过度(我只是遵循你的 Apache 实现),而这也可能有效(跳过几个步骤):
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /public/index.php?url=$1 last;
}
如果您不介意url
参数中以斜杠开头,则可以简化为:
location / {
try_files $uri $uri/ /public/index.php?url=$uri;
}