Apache 在 Nginx 上重写

Apache 在 Nginx 上重写

我有以下 .htaccess 文件

DirectoryIndex index.php
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^$ index.php [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
<ifModule mod_php5.c>
    php_flag display_errors Off
</IfModule>

我的代码使用 Apache 运行良好。但现在我使用 Nginx,以下是我的配置

server {
    listen 80;
    server_name example.com;
    root /srv/www/example.com/public_html;
    access_log /srv/www/example.com/logs/access.log;
    error_log /srv/www/example.com/logs/error.log;
    server_tokens off;
    if (!-e $request_filename) {
        rewrite ^(.*)$ index.php last;
    }
    location / {
        index index.php;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
    }
}

但是我的代码不起作用,请帮忙

谢谢

答案1

简单的答案是,apache 中的重写指令与 nginx 中的不同。

查看 nginx 重写文档:http://wiki.nginx.org/HttpRewriteModule

幸运的是,与某些人认为是黑魔法的 mod_rewrite 规则相比,nginx HttpRewriteModule 在构建重写逻辑方面相当容易理解

答案2

首先,您确实应该避免在 nginx 上使用 if。在 nginx wiki 上搜索 ifIsEvil。

那么,您就不需要 nginx rexrite 来处理诸如服务目录、现有文件以及最后的 index.php 等简单的事情。一个简单的 try_files 就可以完成这项工作。阅读 nginx FAQ 并搜索 try_file。

查看这个答案:https://stackoverflow.com/questions/8199797/convert-this-apache-rewrite-to-nginx-rules/8200728#8200728

答案3

如果我没记错的话,您有一个 Zend 或其他框架引导程序。在这种情况下,请使用以下配置:

server {
    listen 80;
    server_name example.com;
    root /srv/www/example.com/public_html;
    access_log /srv/www/example.com/logs/access.log;
    error_log /srv/www/example.com/logs/error.log;
    server_tokens off;

    try_files $uri $uri/ /index.php?$args;

    location = /index.php {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
    }
}

或者

server {
    listen 80;
    server_name example.com;
    root /srv/www/example.com/public_html;
    access_log /srv/www/example.com/logs/access.log;
    error_log /srv/www/example.com/logs/error.log;
    server_tokens off;

    try_files $uri $uri/ /index.php?$args;

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
    }
}

相关内容