Jump to content

Prestashop+nginx+ЧПУ


Recommended Posts

Знаю тема уже избитая и тут даже один раз поднималась, но предложенный там конфиг не решает проблемы.

Итак, есть пресловутый конфиг:

rewrite ^/([a-z0-9]+)-([a-z0-9]+)(-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*).jpg$ /img/p/$1-$2$3.jpg last;
rewrite ^/([0-9]+)-([0-9]+)/([_a-zA-Z0-9-]*).jpg$ /img/p/$1-$2.jpg last;
rewrite ^/([0-9]+)(-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*).jpg$ /img/c/$1$2.jpg last;
rewrite "^/lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$ /product.php?id_product=$3&isolang;=$1$5" last;
rewrite "^/lang-([a-z]{2})/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$ /product.php?id_product=$2&isolang;=$1$4" last;
rewrite "^/lang-([a-z]{2})/([0-9]+)-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$2&isolang;=$1" last;
rewrite ^/([a-zA-Z0-9-]*)/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$ /product.php?id_product=$2$4 last;
rewrite ^/([0-9]+)-([a-zA-Z0-9-]*).html(.*)$ /product.php?id_product=$1$3 last;
rewrite ^/([0-9]+)-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$1 last;
rewrite ^/content/([0-9]+)-([a-zA-Z0-9-]*)(.*)$ /cms.php?id_cms=$1 last;
rewrite ^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /supplier.php?id_supplier=$1$3 last;
rewrite ^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /manufacturer.php?id_manufacturer=$1$3 last;
rewrite "^/lang-([a-z]{2})/(.*)$ /$2?isolang=$1" last

взятый с сысоевского сайта, но там не указаны параметры локейшена, соотвественно, начинаю с простого, вставляю правила в конструкцию

location ~ \.php$ {
}

ну и естественно они не срабатывают, потому что сей локейшн работает только для php файлов.

Дальше, вставляю часть правил в конструкцию

location ~*\.(jpg|html)$ {
  rewrite ^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2$3.jpg last;
  rewrite ^/([0-9]+)\-([0-9]+)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2.jpg last;
  rewrite ^/([0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/c/$1$2.jpg last;
  rewrite ^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 last;
  rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$1$3 last;
}

ОК, показ товаров работает, картинки оторбаражаются, идем дальше, надо как-то отображать статические страницы

location /content/ {
  rewrite ^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /cms.php?id_cms=$1 last;
}

Работает, добавляем показ производителей и поставщиков

location ~/([0-9]+)__([a-zA-Z0-9-]*)(.*) {
  rewrite ^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /supplier.php?id_supplier=$1$3 last;
}
location ~/([0-9]+)_([a-zA-Z0-9-]*)(.*) {
  rewrite ^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /manufacturer.php?id_manufacturer=$1$3 last;
}

Добавляем показ категорий

location ~/([0-9]+)\-([a-zA-Z0-9-]*)(.*) {
  rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$1 last;
}

И тут появляется первый подвох, если этот локейшн поместить перед ~*\.(jpg|html)$ то перестанут показываться картинки товаров, когда просматриваешь в режими категорий, потому что эта конструкция совпадает с форматом картинок domain.ru/7-60-home/prod-1.jpg так что сначала даем отработать ~*\.(jpg|html)$ а потом уже категориям.

В принципе теперь все работает(lang я не использую, язык у меня один), кроме страниц, перечисленных в админке в разделе Настройки/Мета-теги и ЧПУ такие, как best-sales.php, sitemap.php, authentication.php ну и так далее, они в ЧПУ выглядят, соответственно, как domain.ru/best-sales, domain.ru/sitemap, domain.ru/authentication и т.д. как их обрабатывать? тупо прописывать к каждому из этих файлов свой локейшн?! огород. Начал придумывать всякие конструкции типа

location ~/([a-zA-Z-]*)(.*) {
  rewrite ^/([a-zA-Z-]*)(.*)$ /$1.php last;
}

работает, но только когда открываешь эти пути domain.ru/best-sales, если пытаешься открыть корень domain.ru/ выдает 404.

Может, конечно, я тут слишком много конструкций нагородил, прошу сильно не ругать, с регулярными выражениями не дружу, экстраполирую на основе имеющихся примеров.

Прошу откликнуться настроивших это дело, на сайте у тов. Kerm, я точно знаю, работает))) Просто не хочу в личку писать, пусть решение будет озвучено открыто, может ещё кому понадобится.

Share this post


Link to post
Share on other sites

параметры локейшена зависят от того что именно отдается нжинксом, если отдается только статика - оставляете правила под нее, остальное на апач. Общий "пресловутый конфиг взятый с сысоевского сайта" я привел чтобы народу легче искать было.

 

чтобы не городить огород со статическими страницами, можно заглянуть в генерируемый движком хтассес (ведь нам фактически надо переписать правила под другой сервер) и видим

 

RewriteRule ^content/([0-9]+)\-([a-zA-Z0-9-]*) /cms.php?id_cms=$1 [QSA,L]

- для созданых нами страниц, и типа так

 

RewriteRule ^best-sales$ /best-sales.php [QSA,L]

стандартные все прописаны

Share this post


Link to post
Share on other sites

что именно отдается нжинксом, если отдается только статика - оставляете правила под нее

Да, в общем-то, nginx отдавать может только статику, для того он и создавался. Апача у меня нет, за нжинксом стоит php-fpm через FastCGI.

чтобы не городить огород со статическими страницами, можно заглянуть в генерируемый движком хтассес (ведь нам фактически надо переписать правила под другой сервер) и видим

В том-то и дело, что ничего полезного мне там нет, почему я и создал этот топик. Там перечислены последовательно правила для всех возможных страниц, я поэтому и спросил, что, мол, для каждой страницы создавать отдельный локейшн? Просто настройка нжинкса и конфиг апача различаются в обработке правил, для апача нет понятия локейшна, он тупо обрабатывает все поступающие запросы, перекидывая php-файлы на интерпретатор PHP и правила реврайта, соответственно, можно перечислять последовательно какие хочешь, все обработает, а нжинкс не будет обрабатывать страницу http://domain.ru/best-sales, если поместить правило rewrite ^/best-sales/$ /best-sales.php last; в локейшн location ~ \.php$ вот и спрашиваю, как делают? Теперь, похоже, сам начинаю понимать, что, наверное, придется каждую из страниц обрабатывать отдельным локешном, потому что как тут написать универсальный локейшн, когда эти страницы именуются простым текстом без какого-либо особого синтаксиса, правило может совпасть с категорией(если использовать метод "без id категории"), например, http://domain.ru/sitemap и http://domain.ru/coats, попробуй раздели их.

Может КТО-НИБУДЬ просто выложить рабочий конфиг нжинкса? Что там за ним стоит, PHP-FastCGI или Apache неважно, смогу исправить proxy_pass на fastcgi_pass :)

Share this post


Link to post
Share on other sites

как я уже сказал выше - все зависит от того что отдает нжинкс, у меня отдает картинки онли, на остальное я не заморачивался и не вникал особо.

судя по http://nginx.org/ru/...e.html#location

все можно разрулить на уровне общих локейшенов, без прописания правила на каждую страницу, там пример есть

 

П.С. почему ты взялся именно за \.php, если можно обрабатывать /

да и судя по

Для определения соответствия location'а и запроса сначала проверяются location'ы, заданные обычными строками. Среди них ищется максимальное совпадение. Затем проверяются регулярные выражения. В отличие от обычных строк, они не сортируются, а проверяются в порядке их следования в конфигурационном файле. Проверка регулярных выражений прекращается после первого же совпадения. Если совпадение с регулярным выражением не найдено, то используется конфигурация максимально совпавшего location'а.

 

можно разрулить в рамках одно локейшена вообще, т.к. статичные страницы будут прописаны строками

Share this post


Link to post
Share on other sites

П.С. почему ты взялся именно за \.php, если можно обрабатывать /

Потому что у меня с таким локейшном на запросы типа domain.ru/admin123 или любой другой без "/" на конце выдается ошибка "No input file specified", сколько не разбирался, сколько не крутил дрективу "fastcgi_intercept_errors on|off;" ошибка не исчезает, решил, что логичнее будет явно передавать php-fpm'у файлы *.php

Курю мануал... очень не хватает знания регулярок((. Все-таки, если у кого есть магазин полностью на нжинксе, выложите конфиг.

Share this post


Link to post
Share on other sites

Решил "проблему" :D

В общем, как и говорил, проблема была в нехвате знаний регулярных выражений и некоторые проблемы в понимании настроек nginx.

Переделал конфиг, убрал все лишнее из конфига домена, вынес настройку престы и php-fpm в отдельные файлы, вот что получилось:

site.ru.conf

server {
	listen xx.xx.xx.xx:80;
	server_name site.ru www.site.ru;
	access_log /var/log/nginx/site.ru_access.log;
	root /var/www/domains/site.ru/;
	index index.php index.htm index.html;
	fastcgi_temp_path /var/cache/nginx/site.ru;
	access_log on;
	if ($host = 'site.ru') {
			rewrite ^/(.*)$ http://www.site.ru/$1 permanent;
	}

	include prestashop.conf;
	include php.conf;
	location ~*\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpeg|mpg|avi|zip|gz|bz2|rar|bmp|exe|pdf|swf|flv|ico|txt|xml|doc|docx|xls|xlsx|htm|html)$ {
			root /var/www/domains/site.ru/;
	}
	location ~ /\.ht {
			deny all;
	}
}

prestashop.conf

rewrite ^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2$3.jpg last;
rewrite ^/([0-9]+)\-([0-9]+)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2.jpg last;
rewrite ^/([0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/c/$1$2.jpg last;
rewrite "^/lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$3&isolang;=$1$5" last;
rewrite "^/lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2&isolang;=$1$4" last;
rewrite "^/lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$2&isolang;=$1" last;
rewrite ^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 last;
rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$1$3 last;
rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$1 last;
rewrite ^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /cms.php?id_cms=$1 last;
rewrite ^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /supplier.php?id_supplier=$1$3 last;
rewrite ^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /manufacturer.php?id_manufacturer=$1$3 last;
rewrite "^/lang-([a-z]{2})/(.*)$ /$2?isolang=$1" last;
rewrite ^/page-not-found$ /404.php last;
rewrite ^/address$ /address.php last;
rewrite ^/addresses$ /addresses.php last;
rewrite ^/authentication$ /authentication.php last;
rewrite ^/best-sales$ /best-sales.php last;
rewrite ^/cart$ /cart.php last;
rewrite ^/contacts$ /contact-form.php last;
rewrite ^/discount$ /discount.php last;
rewrite ^/guest-tracking$ /guest-tracking.php last;
rewrite ^/order-history$ /history.php last;
rewrite ^/identity$ /identity.php last;
rewrite ^/manufacturers$ /manufacturer.php last;
rewrite ^/my-account$ /my-account.php last;
rewrite ^/new-products$ /new-products.php last;
rewrite ^/order$ /order.php last;
rewrite ^/order-follow$ /order-follow.php last;
rewrite ^/quick-order$ /order-opc.php last;
rewrite ^/order-slip$ /order-slip.php last;
rewrite ^/password-recovery$ /password.php last;
rewrite ^/prices-drop$ /prices-drop.php last;
rewrite ^/search$ /search.php last;
rewrite ^/sitemap$ /sitemap.php last;
rewrite ^/stores$ /stores.php last;
rewrite ^/supplier$ /supplier.php last;

php.conf

location ~ \.php$ {
	fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
	fastcgi_param  QUERY_STRING	   $query_string;
	fastcgi_param  REQUEST_METHOD	 $request_method;
	fastcgi_param  CONTENT_TYPE	   $content_type;
	fastcgi_param  CONTENT_LENGTH	 $content_length;
	fastcgi_param  SCRIPT_NAME		$fastcgi_script_name;
	fastcgi_param  REQUEST_URI		$request_uri;
	fastcgi_param  DOCUMENT_URI	   $document_uri;
	fastcgi_param  DOCUMENT_ROOT	  $document_root;
	fastcgi_param  SERVER_PROTOCOL	$server_protocol;
	fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
	fastcgi_param  SERVER_SOFTWARE	nginx/$nginx_version;
	fastcgi_param  REMOTE_ADDR		$remote_addr;
	fastcgi_param  REMOTE_PORT		$remote_port;
	fastcgi_param  SERVER_ADDR		$server_addr;
	fastcgi_param  SERVER_PORT		$server_port;
	fastcgi_param  SERVER_NAME		$server_name;
	fastcgi_param  REDIRECT_STATUS	200;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_connect_timeout 60;
	fastcgi_send_timeout 180;
	fastcgi_read_timeout 180;
	fastcgi_buffer_size 24k;
	fastcgi_buffers 16 24k;
	fastcgi_busy_buffers_size 24k;
	fastcgi_temp_file_write_size 256k;
	fastcgi_intercept_errors on;
}

Может кому пригодится.

Share this post


Link to post
Share on other sites

  • 4 months later...

Сейчас поставил престу на сервер без апача на php-fpm и увидев конфиг представленный выше появились вопросы, а зачем или для чего нужно указывать это:

 

			fastcgi_param  QUERY_STRING		$query_string;
			fastcgi_param  REQUEST_METHOD	$request_method;
			fastcgi_param  CONTENT_TYPE		$content_type;
			fastcgi_param  CONTENT_LENGTH	$content_length;
			fastcgi_param  SCRIPT_NAME			  $fastcgi_script_name;
			fastcgi_param  REQUEST_URI			  $request_uri;
			fastcgi_param  DOCUMENT_URI		$document_uri;
			fastcgi_param  DOCUMENT_ROOT	  $document_root;
			fastcgi_param  SERVER_PROTOCOL  $server_protocol;
			fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
			fastcgi_param  SERVER_SOFTWARE  nginx/$nginx_version;
			fastcgi_param  REMOTE_ADDR			  $remote_addr;
			fastcgi_param  REMOTE_PORT			  $remote_port;
			fastcgi_param  SERVER_ADDR			  $server_addr;
			fastcgi_param  SERVER_PORT			  $server_port;
			fastcgi_param  SERVER_NAME			  $server_name;
			fastcgi_param  REDIRECT_STATUS  200;

 

У меня все работает вот с таким кофигом и я просто хочу понять стоит ли мне дописывать эти строчки в него и для чего:

 

 location ~ \.php$ {
  root /var/www/user/data/www/site.ru;
	  fastcgi_connect_timeout 100000s;
	  fastcgi_read_timeout 1000000s;
	  fastcgi_send_timeout 1000000s;
	  fastcgi_buffer_size 64k;
	  fastcgi_buffers 16 64k;
	  fastcgi_param  SCRIPT_NAME index.php;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include		fastcgi_params;	
	}

Share this post


Link to post
Share on other sites

И еще вопрос, поскольку на сервере нету апача, то .htaccess файлы не обрабатываются и поскольку php-fpm на некоторые папки стоят права 777...для меня это первый опыт без апача, скажите безопасно ли это?

Share this post


Link to post
Share on other sites

  • 6 months later...

Всем привет!

Вышла преста 1.5, в которой немного изменился механизм вынутренних вызовов и, соответсвенно, URL. Если в версии 1.4 URL был вида /product.php?id_product=4, то теперь URL изменился на /index.php?id_product=4&controller=product

Переделал конфиг

rewrite ^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2$3.jpg last;
rewrite ^/([0-9]+)\-([0-9]+)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2.jpg last;
rewrite ^/([0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/c/$1$2.jpg last;
rewrite "^/lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /inde.php?id_product=$3&isolang;=$1$5&controller=product" last;
rewrite "^/lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /index.php?id_product=$2&isolang;=$1$4&controller=product" last;
rewrite "^/lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /index.php?id_category=$2&isolang;=$1&controller=category" last;
rewrite ^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /index.php?id_product=$2$4&controller=product last;
rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /index.php?id_product=$1$3&controller=product last;
rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /index.php?id_category=$1&controller=category last;
rewrite ^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /index.php?id_cms=$1&controller=cms last;
rewrite ^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /index.php?id_supplier=$1$3&controller=supplier last;
rewrite ^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /index.php?id_manufacturer=$1$3&controller=manufacturer last;
rewrite "^/lang-([a-z]{2})/(.*)$ /$2?isolang=$1" last;

rewrite ^/page-not-found$ /index.php?controller=404 last;
rewrite ^/address$ /index.php?controller=address last;
rewrite ^/addresses$ /index.php?controller=addresses last;
rewrite ^/authentication$ /index.php?controller=authentication last;
rewrite ^/best-sales$ /index.php?controller=best-sales last;
rewrite ^/cart$ /index.php?controller=cart last;
rewrite ^/contacts$ /index.php?controller=contact-form last;
rewrite ^/discount$ /index.php?controller=discount last;
rewrite ^/guest-tracking$ /index.php?controller=guest-tracking last;
rewrite ^/order-history$ /index.php?controller=history last;
rewrite ^/identity$ /index.php?controller=identity last;
rewrite ^/manufacturers$ /index.php?controller=manufacturer last;
rewrite ^/my-account$ /index.php?controller=my-account last;
rewrite ^/new-products$ /index.php?controller=new-products last;
rewrite ^/order$ /index.php?controller=order last;
rewrite ^/order-follow$ /index.php?controller=order-follow last;
rewrite ^/quick-order$ /index.php?controller=order-opc last;
rewrite ^/order-slip$ /index.php?controller=order-slip last;
rewrite ^/password-recovery$ /index.php?controller=password last;
rewrite ^/prices-drop$ /index.php?controller=prices-drop last;
rewrite ^/search$ /index.php?controller=search last;
rewrite ^/sitemap$ /index.php?controller=sitemap last;
rewrite ^/stores$ /index.php?controller=stores last;
rewrite ^/supplier$ /index.php?controller=supplier last;

Edited by Comrada (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

Kerm, не знаю актуально ли еще, давно не читал тему:

1) Я так понимаю, все зависит от продвинутости браузера, в большинстве случаев работать будет и так, эта же большая конструкция просто заполняет HTTP заголовок, чтоб все было совсем уж корректно. Пусть будет. Вообще, все эти параметры прописаны в файле /etc/nginx/fastcgi_params и должны подключаются из основного файла конфиги include fastcgi_params; в случае использования php через fastcgi. Я их просто скопировал в свой файл настройки, чтоб не подключать 3 файла конфиги.

1.1) Читал на Хабре статью, в которой проводилось сравнение производительности высоконагруженного сервера в двух конфигурациях: с работой PHP через порты и через сокеты, так вот результаты показали, что быстрее работает сервер через сокеты, т.е. не:

fastcgi_pass   127.0.0.1:9000

а

fastcgi_pass   unix:/var/run/php-fpm/fcgi.sock;

Кроме того, так можно настраивать уровни доступа к сокетам разными фронт-энд серверами, если хостишь несколько разных клиентов. Я у себя поправил.

 

2) По правам и безопасности пусть выскажутся специалисты

Share this post


Link to post
Share on other sites

Здравствуйте.

Тоже использую на сервере Nginx (без Apache). С правилами пришлось долго помучиться.

Весь блок правил перезаписи для страниц можно заменить следующим образом (Prestashop 1.5; Nginx-1.2.4):

 

 

location / {try_files $uri $uri/ @rewrite;}location @rewrite {rewrite ^/(.*)$ /index.php?q=$1;}

 

 

Правила для обработки 404 ошибки перенес в секцию server.

Правила для изображений примерно такие-же как и у Comrada.

Магазин только наполняю, пока ошибок нет. У себя используйте на свой страх и риск. Не забывайте делать резервные копии конфигов.

Единственно что мне не нравится это обработка движком 404 ошибки. Если в адрес специально внести ошибку - движок делает переадресацию на ближайший товар. Грешил на неправильно написаный конфиг Nginx для обработки 404 ошибки, но попробовал на локалке с Apache - таже самая картина.

Всем ВСЕГО ДОБРОГО!

Edited by Revival (see edit history)

Share this post


Link to post
Share on other sites

Решил страницы так же перевести на ЧПУ. Сайт в интернете уже 2 года. Я боюсь что потеряю добавления ЧПУ рейтинги страниц понизятся. Подскажите пожалуйста как делать 301 редирет на ЧПУ с старых страниц.

 

Покажите пожалуйста хотя бы на 1 примере, например:

rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /index.php?id_product=$1$3&controller=product last;

 

А дальше я уже сам.

Edited by celovec (see edit history)

Share this post


Link to post
Share on other sites

Я делал 301 редирект со старых страниц на новые. Обе страницы на одном сайте. Вот моя запись?

RewriteRule ^(.*)vse-dlya-kosmetiki/45-krem-504.htmlhttp://www.moisait.ru/78-krem-704.html [R=301,L]

Соответственно подставляем свои данные и все работает.

Выделено, обязательные параметры. Между .htmlпробелhttp://

Share this post


Link to post
Share on other sites

  • 3 weeks later...

Решил страницы так же перевести на ЧПУ. Сайт в интернете уже 2 года. Я боюсь что потеряю добавления ЧПУ рейтинги страниц понизятся. Подскажите пожалуйста как делать 301 редирет на ЧПУ с старых страниц.

 

Покажите пожалуйста хотя бы на 1 примере, например:

rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /index.php?id_product=$1$3&controller=product last;

 

А дальше я уже сам.

Правильно ли я понял, нужно урл вида site.ru/index.php?id_category=9&controller=category преобразовать в site.ru/9-category-name ? Если так, то средствами одного только nginx будет очень сложно, ведь чпу генерируется на основе seo алиасов, которые задаются при создании того или иного товара или категории, все они уникальные, по сути, это надо для каждой категории и товара прописывать правило реврайта, т.е. для site.ru/index.php?id_category=9&controller=category это может быть например /site.ru/9-shampoo, а для site.ru/index.php?id_product=13&controller=product соответственно site.ru/13-amway-home-loc-chistjashhee-sredstvo-dlja-metallicheskih-poverhnostey.html и как это можно описать регулярными выражениями?:) или я неправильно понял? Для чего или для кого нужны эти правила реврайта? Если вы боитесь, что ссылки вида index.php?id_category=9 умрут, то это не так, если включен режим чпу, то при переходе по таким ссылкам преста сама перейдет на соответствующей ей ссылке чпу.

Share this post


Link to post
Share on other sites

Не чего не понизится, даже с включенным ЧПУ, страницы сайта все равно доступны по ссылкам без чпц, т.е. одна и тажа страница будет доступна по двум ссылкам. И по ссылке без ЧПЦ если перейти то будет идти 301 редирект на правильную ссылку что тем же яндексом не запрещается и время не наносит.

Share this post


Link to post
Share on other sites

  • 2 months later...

Ваш пример для Apache, у меня же prestashop работает на Nginx без Apache. К сожалению мне ваш пример не подойдет.

 

У себя делал так:

 

if ($request_uri = /КАТЕГОРИЯ/ПОДКАТЕГОРИЯ) {
   rewrite ^ /НОВАЯ КАТЕГОРИЯ/ permanent;#301 redirect
   }

Share this post


Link to post
Share on other sites

Интересная проблема, если юзать Ajax навигацию между страницами в каталоге, то с верху добавляется hash ссылка, но если к этой ссылке добавить значение любое то всеравно сайт отдает 200 ОК. Например там идет /80397118-plavki#/page-3 и изменить значение на http://bikinimal.ru/80397118-plavki#/page-343, т.е на несуществующий номер страницы, то все равно отдается 200 OK, вот как бы сделать 404 или 301 редирект чтобы шел к примеру на главную страницу сайта.

Share this post


Link to post
Share on other sites

  • 1 year later...

А кто сталкивался с проблемой 404 страницы на связке NGINX+php-fpm (без Apache)

На Апаче была нормальная страница 404 по шаблону сайта с шапкой, меню и всем остальным. Поставил на конфигу без Апача и теперь 404 стала такой:

404 Not Found

nginx

Вот мой конфиг:

 

 

server {
       listen 80;
       server_name mydomain.ru;
       root /var/www/mydomain.ru/web/;
 
 
       index index.php index.html;
 
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
 
       location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
       }
 
       # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
       location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
       }
 
       rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
       rewrite ^/([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$1$2$3.jpg last;
       rewrite ^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3$4.jpg last;
       rewrite ^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4$5.jpg last;
       rewrite ^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg last;
       rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg last;
       rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg last;
       rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg last;
       rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.jpg last;
       rewrite ^/c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2$3.jpg last;
       rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2.jpg last;
       rewrite ^/images_ie/?([^/]+)\.(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/$1.$2 last;
       rewrite ^/page-not-found$ /index.php?controller=404 last;
       try_files $uri $uri/ /index.php$is_args$args;
       error_page 404 /index.php?controller=404;
  
       location ~* \.(gif)$ {
          expires 2592000s;
       }
       location ~* \.(jpeg|jpg)$ {
          expires 2592000s;
       }
       location ~* \.(png)$ {
          expires 2592000s;
       }
       location ~* \.(css)$ {
          expires 604800s;
       }
       location ~* \.(js|jsonp)$ {
          expires 604800s;
       }
       location ~* \.(js)$ {
          expires 604800s;
       }
       location ~* \.(ico)$ {
          expires 31536000s;
       }
 
       location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_intercept_errors on;
       }
    }
 

 

 

 

Если прописать error_page 404 /404.html, то будет именно 404.html отображаться. Т.е. проблема в том, что Nginx не хочет отображать нормально /index.php?controller=404.

 

Кто подскажет как исправить?

Share this post


Link to post
Share on other sites

  • 1 year later...

Всем привет.

 

Тестирую рабочий сайт на nginx+php-fpm. 

 

Вроде всё неплохо, но после смены домена через админку получаю такое предупреждение:

Перед использованием этой утилиты, вам нужно
- Создать пустой файл .htaccess в вашем корневом каталоге.
- Дать разрешение на запись (CHMOD 666 в системе Unix).

 

Хтаксес конечно есть, права на запись стоят.

В location nginxa на время тестов выставил:

location ~ /\.ht {
    allow  all;
     }
 
в логе ошибка:
FastCGI sent in stderr: "PHP message: PHP Warning:  file_put_content(site.ua/config/xml
/default_country_modules_list.xml): failed to open stream: Permission denied in /var/www/site.ua/classes/controller/AdminController.php on  line 1926
 
 
итог - не могу включить ЧПУ.
 
 
Права вроде правильные стоят на файлы/папки. Кто-то может подсказать ?
Edited by alpik (see edit history)

Share this post


Link to post
Share on other sites

ларчик просто открывался. В ядро Centos 7 встроена надстройка SElinux, которая пока не очень видимо дружит с nginx, 

в консоли

setenforce permissive

Edited by alpik (see edit history)

Share this post


Link to post
Share on other sites

Может кому поможет мой Nginx (от версии 1.5 другого своего магазина поставил на 1.6, вроде полет нормальный).

 

В коде слова ВАШСАЙТ и ВАШIP замените на свои, соответственно )

 

Может мусора и много, но работает )

#user 'user' virtual host 'ВАШСАЙТ.ru' configuration file
server {
	server_name ВАШСАЙТ.ru www.ВАШСАЙТ.ru;
	charset off;
	disable_symlinks if_not_owner from=$root_path;
	index index.html index.php;
	root $root_path;
	set $root_path /var/www/user/data/www/ВАШСАЙТ.ru;
	access_log /var/www/httpd-logs/ВАШСАЙТ.ru.access.log ;
	error_log /var/www/httpd-logs/ВАШСАЙТ.ru.error.log notice;
	listen ВАШIP:80;

	include /etc/nginx/vhosts-includes/*.conf;

        # ПРАВИЛА ДЛЯ ПРЕСТАШОП 1.5
	location ~* \.(js|css|gif|png|jpeg) {
		add_header Cache-Control "public, max-age=604800";
	}
		
	location ~* \.jpg {
		add_header Cache-Control "public, max-age=604800";

		rewrite "^/c/([0-9]+)(\-[_a-zA-Z0-9-]*)/(.*)\.jpg$" /img/c/$1$2.jpg break;
		rewrite "^/c/([_a-zA-Z-]+)/(.*)\.jpg$" /img/c/$1.jpg break;
		rewrite "^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/(\P{M}\p{M}*)*\.jpg$" /img/p/$1-$2$3.jpg break;
		rewrite "^/([0-9]+)\-([0-9]+)/(\P{M}\p{M}*)*\.jpg$" /img/p/$1-$2.jpg break;
		rewrite "^/([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$1$2.jpg break;
		rewrite "^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$1$2$3.jpg break;
		rewrite "^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$1$2$3$4.jpg break;
		rewrite "^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$1$2$3$4$5.jpg break;
		rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg break;
		rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg break;
		rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg break;
		rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg break;
	}

	location / {
	
		if ($arg_link_rewrite != "") {
			rewrite ^/(.+) http://$host/$1? permanent;
		}
	# ПРАВИЛА ДЛЯ ПРЕСТАШОП 1.5
        rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
        rewrite "^/([0-9]+)\-(\P{M}\p{M}*)+\.html(.*)$" /index.php?controller=product&id_product=$1$3 last;
        rewrite "^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=category&id_category=$1$3 last;
        rewrite "^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$" /index.php?controller=product&id_product=$2$4 last;
        rewrite "^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$" /index.php?controller=supplier&id_supplier=$1$3 last;
        rewrite "^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$" /index.php?controller=manufacturer&id_manufacturer=$1$3 last;
        rewrite "^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=cms&id_cms=$1$3 last;
        rewrite "^/content/category/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=cms&id_cms_category=$1$3 last;
        rewrite "^/module/([_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)$" /index.php?fc=module&module=$1&controller=$2 last;
        rewrite ^/page-non-trouvee$ /index.php?controller=404 last;
        rewrite ^/adresse$ /index.php?controller=address last;
        rewrite ^/adresses$ /index.php?controller=addresses last;
        rewrite ^/authentification$ /index.php?controller=authentication last;
        rewrite ^/meilleures-ventes$ /index.php?controller=best-sales last;   
        rewrite ^/panier$ /index.php?controller=cart last;
        rewrite ^/contactez-nous$ /index.php?controller=contact-form last;
        rewrite ^/bons-de-reduction$ /index.php?controller=discount last; 
        rewrite ^/suivi-commande-invite$ /index.php?controller=guest-tracking last;
        rewrite ^/historique-des-commandes$ /index.php?controller=history last;
        rewrite ^/identite$ /index.php?controller=identity last;
        rewrite ^/manufacturers$ /index.php?controller=manufacturer last;
        rewrite ^/mon-compte$ /index.php?controller=my-account last;
        rewrite ^/nouveaux-produits$ /index.php?controller=new-products last;
        rewrite ^/commande$ /index.php?controller=order last;
        rewrite ^/details-de-la-commande$ /index.php?controller=order-follow last;
        rewrite ^/commande-rapide$ /index.php?controller=order-opc last;
        rewrite ^/avoirs$ /index.php?controller=order-slip last;
        rewrite ^/mot-de-passe-oublie$ /index.php?controller=password last;
        rewrite ^/promotions$ /index.php?controller=prices-drop last;
        rewrite ^/recherche$ /index.php?controller=search last;
        rewrite ^/plan-du-site$ /index.php?controller=sitemap last;
        rewrite ^/magasins$ /index.php?controller=stores last;
        rewrite ^/supplier$ /index.php?controller=supplier last;
        rewrite ^/page-not-found$ /index.php?controller=404 last;
        rewrite ^/address$ /index.php?controller=address last;   
        rewrite ^/addresses$ /index.php?controller=addresses last;
        rewrite ^/authentication$ /index.php?controller=authentication last;
        rewrite ^/best-sales$ /index.php?controller=best-sales last;
        rewrite ^/cart$ /index.php?controller=cart last;
        rewrite ^/contacts$ /index.php?controller=contact-form last;
        rewrite ^/discount$ /index.php?controller=discount last;
        rewrite ^/guest-tracking$ /index.php?controller=guest-tracking last;
        rewrite ^/order-history$ /index.php?controller=history last;
        rewrite ^/identity$ /index.php?controller=identity last;
        rewrite ^/manufacturers$ /index.php?controller=manufacturer last;
        rewrite ^/my-account$ /index.php?controller=my-account last;
        rewrite ^/new-products$ /index.php?controller=new-products last;
        rewrite ^/order$ /index.php?controller=order last;
        rewrite ^/order-follow$ /index.php?controller=order-follow last;
        rewrite ^/quick-order$ /index.php?controller=order-opc last;
        rewrite ^/order-slip$ /index.php?controller=order-slip last;
        rewrite ^/password-recovery$ /index.php?controller=password last;
        rewrite ^/prices-drop$ /index.php?controller=prices-drop last;   
        rewrite ^/search$ /index.php?controller=search last;
        rewrite ^/sitemap$ /index.php?controller=sitemap last;
        rewrite ^/stores$ /index.php?controller=stores last;  
        rewrite ^/supplier$ /index.php?controller=supplier last;
		rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+.jpg$ /img/c/$1$2.jpg last;
		
						
# ЗАКОНЧЕНЫ ПРАВИЛА ДЛЯ ПРЕСТАШОП 1.5


	
	if ( !-e $request_filename ) {

    rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
    break;
}
	# ЗАКОНЧЕНЫ ПРАВИЛА ПРЕСТАШОП 1.5
	
	
	
	
	
		location ~ [^/]\.ph(p\d*|tml)$ {
			try_files /does_not_exists @php;
		}
	}
	location @php {
		fastcgi_index index.php;
		fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]ВАШСАЙТ.ru";
		fastcgi_pass unix:/var/www/php-fpm/user.sock;
		fastcgi_split_path_info ^((?U).+\.ph(?\d*|tml))(/?.+)$;
		try_files $uri =404;
		include fastcgi_params;
	}
}

Edited by SummerResident (see edit history)

Share this post


Link to post
Share on other sites

  • 1 year later...

Более кривого алгоритма не встречал (хотя нет: видел такое уродство).


БАГИ ЧПУ и вообще урлов Prestashop:


  1. Пользователь может "прописывать-не прописывать" обязательные параметры - идеотизм! - баг!
  2. Ссылка на товар формируется без полного пути (по умолчанию) - где категория, без которой нет полного урла? - это SEO баг!
  3. При включении ЧПУ и попытке исправить баг выше добавляем доступные (не для программиста) {category}/ или {categories}/ к урлу товара и лезет очередной баг формирования ссылки на товар: алиас-категории/товарная-ссылка-с-допами, При этом ссылка на категорию идет с ID(а тут нет), и при обрезании урла(/товарная-ссылка-с-допами - сокращаем (как положено)имеем ссылку /алиас-категории и !желанную 404 ошибкут.к. ссылка на саму категорию имеет вид: ID-алиас-категории (или что иное, но ID - ОБЯЗАТЕЛЬНЫЙ параметр, выброшенный из товарной ссылки!).

​Дальше даже не буду писать какие баги, т.к. СМС по факту платная(кроме кривого ядра) для большинства пользователей и это хамство иметь столько косяков в продакшене - установил, поковырял, зае..ся править косяки - которые в престе не называют косяками, а отсутствием купленного плагина или ещё чего.


Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More