Nginx相当于Apache .htaccess

时间:2018-01-04 06:00:13

标签: apache .htaccess mod-rewrite nginx url-rewriting

我已经使用LEMP堆栈安装了一个PHP Web应用程序,我需要将一些Apache .htaccess重写规则移植到Nginx等价物。

的.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?/$0 [PT,L]

我已按照其他Stackoverflow答案中的建议尝试了这两项服务:

这是我的服务器块:

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES$
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhp-2048.pem;

    root /var/www/example;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name example.com;
#    return 302 https://example.com$request_uri;
    access_log  /var/log/nginx/example.access.log;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

}

第一个转换器生成了这个,我在最后一个花括号之前添加了一个附加位置节。语法检查nginx -t检出,但Nginx无法重启。

location / {
  if (!-e $request_filename){
    rewrite ^(.*)$ /index.php?/$0 break;
  }
}

第二个转换器生成了一个不同的规则(下面),我在第一个位置节(在try_files下)添加了这个规则,但是当Nginx没有重启时也会破坏配置。

if (!-f $request_filename){
    set $rule_0 1$rule_0;
}
if (!-d $request_filename){
    set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
    rewrite /.* /index.php?/$0 last;
}

我做错了什么?任何帮助解决这个问题表示赞赏和欢迎。

更新: 我仍然需要帮助。我还没有能够找到第一个为我工作的解决方案。

1 个答案:

答案 0 :(得分:0)

=404声明中的try_files字词更改为/index.php?$uri

例如:

location / {
    try_files $uri $uri/ /index.php?$uri;
}

您的try_files语句只缺少最终重写规则。请注意,nginx中的所有URI都包含前导/。将$uri替换为$0应该适合您。

有关详情,请参阅this document