【问题标题】:Nginx Equivalent of Apache .htaccessApache .htaccess 的 Nginx 等效项
【发布时间】:2018-06-13 20:14:43
【问题描述】:

我使用 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;
}

我做错了什么?感谢并欢迎任何解决此问题的帮助。

更新: 我仍然需要这方面的帮助。我无法发布第一个为我工作的解决方案。

【问题讨论】:

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


    【解决方案1】:

    try_files 语句中的=404 术语更改为/index.php?$uri

    例如:

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

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

    请参阅this document 了解更多信息。

    【讨论】:

    • 感谢您的回复。生成的两个规则都正确吗?我应该使用更新后的try_files 语句中的哪一个?
    • 我将try_files 语句行更改为try_files $uri $uri/ /index.php?$uri;,现在我在浏览器中收到一个错误,提示该站点未正确重定向。
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多