Как вы используете модуль перезаписи Nginx для изменения URI запроса?

Я хотел бы использовать один файл PHP, который использует URI запроса, чтобы решить, какой контент отображать, при этом убедившись, что URL-адрес удобен для пользователя. Первое легко достичь, однако у меня возникают проблемы, когда я пытаюсь реализовать второе.

Я считаю, что это именно то, что Модуль перезаписи Nginx сделано для, но у меня проблемы с пониманием документации, и я не могу заставить ее работать так, как я ожидал. Итак, на данный момент я подвергаю сомнению правильность моего понимания модуля.

Вот то, чего я пытаюсь достичь, в самом простом:

  1. Пользователь идет в http://www.example.com/another-page, Это единственный URL, который видит пользователь, он очень красивый и аккуратный.
  2. Nginx понимает это как http://www.example.com/index.php?page=another-page и передает запрос index.php,
  3. index.php использует параметр запроса, чтобы решить, какой контент отображать.
  4. Nginx отвечает пользователю выводом index.php,

Вот как я пытался это сделать:

nginx.conf

server {

listen                        80;
listen                        [::]:80;
server_name                   localhost;

try_files                     $uri $uri/ =404;
root                          /path/to/root;

# Rewrite the URL so that is can be processed by index.php
rewrite ^/(.*)$ /index.php?page=$1? break;

# For processesing PHP scripts and serving their output
location ~* \.php$ {
fastcgi_pass    unix:/var/run/php5-fpm.sock;

fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $fastcgi_script_name =404;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
}

# For serving static files
location ^~ /static/ {
root            /path/to/static;
}
}

index.php

$uri = $_SERVER['REQUEST_URI'];

switch ($uri){

case '/index.php?page=':
echo 'Welcome home';
break;

case '/index.php?page=another-page':
echo 'Welcome to another page';
break;
}

return;

Где я ошибся?

Я попытался использовать несколько версий этого правила перезаписи и var_dump($_SERVER['REQUEST_URI']) чтобы увидеть, как правило влияет на URI, но оно никогда не действует так, как я хотел бы или ожидал. Я пытался поставить правило в ~* \.php$ контекст местоположения, внося небольшие изменения в регулярное выражение, удаляя и добавляя try_files из контекста и т. д. Я делал это всегда, сначала проверяя свое регулярное выражение с regexpal и затем перезагрузите файл конфигурации Nginx. В любом случае, я либо получил ошибку 500, либо URI остался без изменений.

1

Решение

То, что вы пытаетесь достичь, возможно с помощью следующего конфига:

server {

listen           80;
listen           [::]:80;
server_name      localhost;

root             /path/to/root;
index            index.php;

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

# For processesing PHP scripts and serving their output
location ~* \.php$ {
fastcgi_pass  unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}

# For serving static files
location ^~ /static/ {
root            /path/to/static;
}
}

и немного другой index.php:

$uri = strtok($_SERVER['REQUEST_URI'], '?');  //trim GET parameters

switch ($uri){

case '/':
echo 'Welcome home';
break;

case '/another-page':
echo 'Welcome to another page';
break;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]