апач

апач

Я попытался преобразовать эти правила htaccess в nginx:

апач

# Necessary to prevent problems when using a controller named "index" and having a root index.php
# more here: http://httpd.apache.org/docs/2.2/content-negotiation.html
Options -MultiViews

# Activates URL rewriting (like myproject.com/controller/action/1/2/3)
RewriteEngine On

# Disallows others to look directly into /public/ folder
Options -Indexes

# When using the script within a sub-folder, put this path here, like /mysubfolder/
# If your app is in the root of your web folder, then leave it commented out
RewriteBase /php-mvc/

# General rewrite rules
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

nginx

server {
    listen  80;
    listen  [::]:80 default_server ipv6only=on;

    root /home/goggelz/www;
    server_name localhost;
    rewrite_log on;

    location / {
        index index.php;
    }

    location /php-mvc {
        if (!-d $request_filename){
            set $rule_0 1$rule_0;
        }
        if (!-f $request_filename){
            set $rule_0 2$rule_0;
        }
        if (!-e $request_filename){
            set $rule_0 3$rule_0;
        }
        if ($rule_0 = "321"){
            rewrite^/(.+)$ /php-mvc/index.php?url=$1 last; 
        }

    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;

    }
}

Дело в том, что я хочу использовать перезаписи только в папке /home/goggelz/www/php-mvc, и еще одна проблема: когда я пытаюсь открыть localhost, то файл index.php загружается, но когда я пытаюсь подключиться с 127.0.0.1, то index.php выполняется. Как мне исправить эти проблемы?

решение1

Это версия, использующая try_filesдирективу nginx.

server {
    listen  80;
    listen  [::]:80 default_server ipv6only=on;

    root /home/goggelz/www;
    server_name localhost;
    rewrite_log on;

    index index.php;

    location /php-mvc {
        try_files $uri $uri/ @mvcrewrite;
    }

    location @mvcrewrite {
        rewrite ^ /php-mvc/index.php?url=$request_uri last; 
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Здесь try_filesиспользуется для первой проверки, существует ли запрошенный URI как файл или каталог. Если он существует, он отправляется. Если он не существует, запрос перенаправляется в блок @mvcrewrite, где запрос переписывается для передачи URI в index.php

Это также может решить проблему с открытием localhost.

Связанный контент