Назад | Перейти на главную страницу

Nginx переписывает и перенаправляет одновременно?

У меня есть сайт аркадных игр. Я хочу преобразовать свои URL-адреса в sef.

category : example.com/index.php?category=mario-games > example.com/category/mario-games
game details : example.com/index.php?game=mario-game > example.com/mario-game.html
featured : example.com/featured.php > example.com/featured
pages : example.com/page.php?id=contact > example.com/page/contact

После поиска в Интернете мне удалось добиться перезаписи правил. Но мои старые URL-адреса все еще доступны. Как я могу перенаправить и переписать старые URL-адреса на новые?

server {
    listen       80;
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}

server {
    listen       80;
    server_name  www.example.com;
    root   /usr/share/nginx/domain;

    index  index.php index.html index.htm;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;


        location / {
        rewrite ^/(.*).html$ /index.php?game=$1 last;
        }
        location /category {
        rewrite ^/(.+)/$ /$1 permanent;
        rewrite ^/category/(.*)$ /index.php?category=$1 last;
        }
        location /page {
        rewrite ^/(.+)/$ /$1 permanent;
        rewrite ^/page/(.*)$ /page.php?id=$1 last;
        }
        location /featured {
            rewrite ^/(.+)/$ /$1 permanent;
            rewrite ^/(.*) /featured.php last;
        }






    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    }

    location ~ \.php$ {
        try_files  $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }


    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt  { log_not_found off; access_log off; }

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max; log_not_found off; access_log off;
    }
    location ~* \.(js|jpg|png|css)$ {

        expires 30d;
    }


}

Вы не можете сделать и то, и другое. Цель переписывания - чтобы вы могли принимать запросы с разных путей. Цель перенаправления - отклонить эти запросы туда, куда вы хотите, включая ответ клиенту, чтобы он всегда шел туда (код ответа 301). Попытка сделать и то, и другое может не иметь смысла и невозможна, потому что, как только одно будет сделано, клиент уже отправится в другое место.

Я бы сделал перенаправления внутри вашего index.php, что-то вроде этого:

if (isset($_GET['category'])) {
    header('HTTP/1.1 301 Moved Permanently'); 
    header("Location: http://www.domain.com/category/" . $_GET['category']);
}

Однако с nginx он мог бы работать примерно так (я сам не тестировал подобное решение):

location = /index.php {
    if ($arg_category ~ (.+)) {
        return 301 http://www.domain.com/category/$1;
    }
    try_files  $uri =404;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

Итак, мы сопоставляем файл PHP, а затем тестируем аргумент запроса, записывая его в регулярное выражение для использования с return директива.