请求将Apache的.htaccess规则转换为Nginx Rewrite规则(Laravel项目)
将Laravel项目的Apache .htaccess转换为Nginx规则
以下是对应你两个.htaccess文件的Nginx配置,直接放到站点的server块中即可:
# 对应主目录.htaccess的规则 # 禁止访问敏感文件 location ~* \.(env|config.js|md|gitignore|gitattributes|lock)$ { deny all; } # 移除URL中的index.php(301永久重定向) if ($request_uri ~* "^(.*/)index\.php$") { return 301 $1; } # 将非public开头的请求转发到public目录 location / { if ($request_uri !~ ^/public/) { rewrite ^/(.*)$ /public/$1 last; } } # 对应public子目录.htaccess的规则 location /public { # 处理Authorization头,传递给PHP fastcgi_param HTTP_AUTHORIZATION $http_authorization; # 移除尾部斜杠(非目录的情况) if (-d $request_filename) { break; } if ($request_uri ~* (.+)/$) { return 301 $1; } # Laravel前端控制器:非文件非目录的请求转发到index.php try_files $uri $uri/ /public/index.php?$query_string; } # PHP处理配置(根据实际PHP版本调整) location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
规则对应说明
- 敏感文件禁止访问:对应主目录.htaccess中的
<Files>规则,通过Nginx的location匹配指定后缀,直接拒绝所有请求。 - 移除index.php:匹配包含
index.php的URL,返回301重定向到去掉index.php的路径,和Apache规则效果一致。 - 转发到public目录:判断请求路径不以
/public/开头时,重写路径到public目录下,用last标志终止当前规则并重新匹配。 - Authorization头处理:在public目录的location中添加
fastcgi_param,将HTTP_AUTHORIZATION头传递给PHP,对应Apache设置环境变量的逻辑。 - 移除尾部斜杠:先判断请求是目录则跳过,否则匹配带尾部斜杠的URL,返回301重定向到去掉斜杠的路径。
- 前端控制器:用Nginx标准的
try_files指令,优先尝试访问文件、目录,都不存在时转发到/public/index.php,替代Apache的RewriteCond和RewriteRule组合。
注意:确保Nginx站点根目录指向Laravel项目主目录,PHP-FPM的套接字路径要和实际安装的PHP版本匹配。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

