我正在尝试将一些 apache 规则转换为 nginx。
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
但是,到目前为止我使用的是这个 Nginx 配置。
server {
listen 80;
server_name example.com;
root /path/to/your/document/root;
# Serve files from the public directory if they have an extension
location ~* \.\w+$ {
rewrite ^(.*)$ /public/$1 break;
}
# Route all other requests to server.php
location / {
try_files $uri $uri/ /server.php;
}
}
它不工作
我该如何修复它
要将 Apache 重写规则正确转换为 Nginx 配置,您需要确保将逻辑正确转换为 Nginx 指令。您现有的 Nginx 配置很接近,但需要进行一些调整才能正确处理条件和重写。
这应该有效:
更改:
带有正则表达式 ~* .\w+$ 的位置块处理对带有扩展名的文件的请求,并将其重定向到公共目录。
location / 块检查请求是针对目录还是文件。如果是,则正常处理请求。如果不是,则将请求路由到 server.php。
您会看到,通过在 /location 块内使用 if 语句,我们模仿了 Apache 对目录和文件的重写条件检查,如果请求的资源存在,则可以防止不必要地路由到 server.php。
不要忘记重新加载配置: