Permalinks + PHP + NGINX найдём правильный конфиг?

Есть самописный скрипт, в котором есть возможность включать ЧПУ из админки, но кофиги решил не прилагать так как много разных http-серверов.

Что имеем:
файл classes.php в который содержит разные функции, одна из которых отвечает за формирование permalinks
function permalink($url) {
	// url: the URL to be rewritten
	global $settings;

	if($settings['permalinks']) {
		$path['profile'] 			= 'index.php?a=profile';
		$path['group'] 				= 'index.php?a=group';
		$path['page'] 				= 'index.php?a=page';
		$path['feed']			 	= 'index.php?a=feed';
		$path['notifications'] 		= 'index.php?a=notifications';
		$path['settings'] 			= 'index.php?a=settings';
		$path['messages']			= 'index.php?a=messages';
		$path['post']				= 'index.php?a=post';
		$path['search']				= 'index.php?a=search';
		$path['info']				= 'index.php?a=info';
		$path['welcome']			= 'index.php?a=welcome';
		$path['recover']			= 'index.php?a=recover';
		$path['thumb']				= 'thumb.php';

		if(strpos($url, $path['profile'])) {
			$url = str_replace(array($path['profile'], '&u=', '&r=', '&filter='), array('profile', '/', '/', '/filter/'), $url);
		} elseif(strpos($url, $path['group'])) {
			$url = str_replace(array($path['group'], '&name=', '&r=', '&search=', '&friends=', '&deleted='), array('group', '/', '/', '/search/', '/friends/', '/deleted/'), $url);
		} elseif(strpos($url, $path['page'])) {
			$url = str_replace(array($path['page'], '&name=', '&r=', '&friends=', '&deleted='), array('page', '/', '/', '/friends/', '/deleted/'), $url);
		} elseif(strpos($url, $path['feed'])) {
			$url = str_replace(array($path['feed'], '&filter=', '&logout', '&token_id='), array('feed', '/filter/', '/logout', ''), $url);
		} elseif(strpos($url, $path['notifications'])) {
			$url = str_replace(array($path['notifications'], '&filter='), array('notifications', '/filter/'), $url);
		} elseif(strpos($url, $path['settings'])) {
			$url = str_replace(array($path['settings'], '&b='), array('settings', '/'), $url);
		} elseif(strpos($url, $path['messages'])) {
			$url = str_replace(array($path['messages'], '&u=', '&id='), array('messages', '/', '/'), $url);
		} elseif(strpos($url, $path['post'])) {
			$url = str_replace(array($path['post'], '&m='), array('post', '/'), $url);
		} elseif(strpos($url, $path['search'])) {
			$url = str_replace(array($path['search'], '&q=', '&tag=', '&pages=', '&groups=', '&filter=', '&age='), array('search', '/', '/tag/', '/pages/', '/groups/', '/filter/', '/age/'), $url);
		} elseif(strpos($url, $path['info'])) {
			$url = str_replace(array($path['info'], '&b='), array('info', '/'), $url);
		} elseif(strpos($url, $path['welcome'])) {
			$url = str_replace(array($path['welcome']), array('welcome'), $url);
		} elseif(strpos($url, $path['recover'])) {
			$url = str_replace(array($path['recover'], '&r=1'), array('recover', '/do/'), $url);
		} elseif(strpos($url, $path['thumb'])) {
			$url = str_replace(array($path['thumb'], '?t=', '&w=', '&h=', '&src='), array('thumb', '/', '/', '/', '/'), $url);
		}
	}

	return $url;
}


файл thumb.php (сделан на основе TimThumb как я понял)
https://pastebin.com/viKEGndg

Мой недо-конфиг
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /usr/local/openresty/nginx/html/default/public;
        index index.php index.html index.htm;
        server_name _;
        location / {
                try_files $uri $uri/ @php;
        }
        location @php {
                rewrite ^/(.*) /index.php?a=$1;
        }
        location ~ \.php {
                try_files $uri = 404;
                #fastcgi_pass 127.0.0.1:9000;
                fastcgi_pass unix:/run/php/php7.3-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # Server error pages to the static page /404.html.
        error_page  404              /404.html;
        location = /404.html {
                root /usr/local/openresty/nginx/html;
        }
        # Server error pages to the static page /50x.html.
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root /usr/local/openresty/nginx/html;
        }
}


С чем проблемы:
Ссылки сокращаются, но реальный переход только index.php?a=feed сокращается до /feed и index.php?a=welcome до /welcome соответственно, остальные ссылки не исполняются - контент либо страницы /welcome (в случае если пользователь не авторизован) или /feed (пользователь авторизован, в этом случае работает ещё index.php?a=settings но при переходе глубже - опять выкидывает на начальную страницу /feed с адресом вида /settings/avatar), адрес при этом меняется.
Thumb.php при при любом состоянии настройки Permalinks возвращает все динамические картинки с кодом 404
DOMAIN/thumb.php?t=a&w=50&h=50&src=default.png - Permalinks OFF
DOMAIN/thumb/a/50/50/default.png - Permalinks ON

Если кому интересно решить задачку, добро пожаловать.
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега PHP
Web developer
Глобальные переменные и простыня из if - это говнокод, в котором сложно искать ошибки и сложно поддерживать.

Всё это можно сделать в 3 строчки:
$queryString = parse_url($url, PHP_URL_QUERY);
parse_str($queryString, $getValues);
return '/' . ($getValues['a']?? '')
   . (isset($getValues['filter'])? '/filter': '')
   . (isset($getValues['deleted'])? '/deleted': '');
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы