LINUX.ORG.RU

RewriteRule

 


0

1

Всем привет!

Уже весь мозг сломал себе, а решения не пойму - прошу помощи :-) Для генерации ЧПУ используется следующий код.

 RewriteRule ^news^tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news^tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]
 RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news^archive/([^/.]+)/?$ index.php?archive=$1 [L]

На странице новостей сайта о банкротстве физических лиц https://bankrot.am/news.html есть список новостей. Если открыть тестовую новость, то выдается адрес https://bankrot.am/news/post/rear - по нему ничего нет, что логично. Если руками убрать /post/ - то новость открывается.

Как побороть неправильную генерацию адреса и сделать так, что бы адрес был без слова пост?



Последнее исправление: beastie (всего исправлений: 2)

^news^tag/ — это что-то странное. Наверняка ты имел в виду ^/news/tag/.

А поправить лучше не ковырянием rewrite, а генерирование самих ссылок в твоём коде, что бы они были без /post/ внутри.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Генерация происходит цмской

emva
() автор топика
Ответ на: комментарий от beastie

<code> RewriteRule ^/news/tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L] RewriteRule ^news/tag/([^/.]+)/?$ index.php?tag=$1 [L] </code> Не помогает :-(

emva
() автор топика
Ответ на: комментарий от emva

Для начала: фонтенд у тебя nginx, а RewriteRule — это для apache.

Что у тебя там? nginx+php-fpm или nginx+apache?

beastie ★★★★★
()
Ответ на: комментарий от emva

Не помогает :-(

И не поможет. Тебе нужно чтобы работали ссылки без post. Они работают, срабатывает вот это правило:

RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]

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

znenyegvkby
()
Ответ на: комментарий от emva
RewriteRule ^/news/post/(.+) /index.php?id=news&post=$1 [L]

Но, если я правильно понял, ты хочешь убрать слово post из линков? Тогда только ковырянием CMS.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от emva

Если не сможешь найти в коде генерацию ссылок, то просто добавь перед всеми правилами еще одно:

RewriteRule ^news/post/([^/.]+)/?$ http://%1/$1 [L,R=301]
Метод костыля :) Но это уж если не осилишь найти код в проекте.

znenyegvkby
()
Ответ на: комментарий от emva

Сори, редирект выше просто стянул, не глянул сразу на вторую часть-то :) Вот рабочий для тебя, пока используй его, чтобы перенаправлять с /news/post/* на /news/post/, а код генерации найду как время освободится.

RewriteRule ^news/post/([^/.]+)/?$ /news/$1 [L,R=301]

znenyegvkby
()
Ответ на: комментарий от emva

Да да, это-то понятно, я и говорю пока пусть будет через редирект, я просто на работе. Через полтора часа у меня перерыв, я скачаю вашу CMS и скажу где и что вам нужно будет отредактировать. Я мельком глянул, и так понял, что там плагины. Если не сложно, дайте сразу ссылку на плагин новостей, который используете (откуда скачали и прикрутили) чтобы мне не искать. А то в демке на сайте изначально плагина с новостями нет.

znenyegvkby
()
Ответ на: комментарий от emva

Вот полностью все правила:

#
# GetSimple CMS htaccess ROOT file
# apache 2.4 
#
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# The following require certain allow overrides, if getting 500 error comment them out one by one 
# can be resolved in apache httpd.conf to ensure security alternatives

# override charset
AddDefaultCharset UTF-8

# prevent directory listings
Options -Indexes

# Follow symbolink links, This is required for rewrites on some hosts
Options +FollowSymLinks

# Set the default handler.
DirectoryIndex index.php

# blocks direct access to the XML files - they hold all the data!
<Files ~ "\.xml$">
	<IfModule !mod_authz_core.c>
		Deny from all
	</IfModule>
	<IfModule mod_access_compat.c>
		Deny from all
	</IfModule>
	<IfModule mod_authz_core.c>
		<IfModule !mod_access_compat.c>
			Require all denied
		</IfModule>
	</IfModule>	
</Files>

<Files sitemap.xml>
	<IfModule !mod_authz_core.c>
		Allow from all
	</IfModule>
	<IfModule mod_access_compat.c>
		Allow from all
	</IfModule>
	<IfModule mod_authz_core.c>
		<IfModule !mod_access_compat.c>
			Require all granted
		</IfModule>
	</IfModule>	
</Files>

# handle rewrites for fancy urls
<IfModule mod_rewrite.c>
	RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

	# Usually RewriteBase is just '/', but 
	# replace it with your subdirectory path
	RewriteBase /

# News Manager:
 RewriteRule ^news^tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news^tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]
 RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news^archive/([^/.]+)/?$ index.php?archive=$1 [L]

RewriteRule ^news/post/([^/.]+)/?$ /news/$1 [L,R=301]
 # end News Manager
	
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule /?([A-Za-z0-9_-]+).html$ index.php?id=$1 [QSA,L]
</IfModule>

emva
() автор топика
Ответ на: комментарий от emva

Проглядел код. Страшно конечно, но что делать :) Модуль news ставится ровно (проверил и с ЧПУ и без) на следующие URL-ы - ://test_for_emva/post/ - список, ://test_for_emva/post/news1 - конкретная запись. Сейчас у вас из-за страницы /news/ перед сслкой все валится. По хорошему там нужно плагин переустановить нормально, но раз внутри все равно жуткий быдло-код, можете смело просто изменить одну строчку для плагина, чтобы он не возвращал /post/.
В файле /директория_сайта/plugins/news_manager/inc/site.php ищите 351 строку в функции nm_show_post:

$url     = nm_get_url('post') . $slug;
И убирайте post, раз он вам не нужен
$url     = nm_get_url() . $slug;
CMS вместе с плагином завел на своем wtest-сервере и проверил. Все работает.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Спасибо вам огромное.

Приеду в офис - проверю на работоспособность. Отпишусь чуть позже по результатам.

emva
() автор топика
Ответ на: комментарий от emva

Работает :-)

Спасибо огромное!

А как быть с .html в конце новости?

Страницы создаются правильно, благодаря RewriteRule /?([A-Za-z0-9_-]+).html$ index.php?id=$1 [QSA,L]

А вот в новостях все заканчивается /

emva
() автор топика
Ответ на: комментарий от emva

Вы все-таки решили пойти тернистым путем костылей :)
Тогда просто добавьте еще одно правило в htaccess

RewriteRule ^news/([^/.]+)/?.html$ index.php?id=news&post=$1 [L]
И в том же файле (/директория_сайта/plugins/news_manager/inc/site.php), в той же строке (351), допишите в конце + .html
$url     = nm_get_url('post') . $slug . '.html';
Но еще раз, лучше все таки просто переустановить модуль. Сейчас у вас ?id=news&post=$1 в правилах, означает что вы запускаете модуль новостей с обычной страницы с суффиксом news, а не отдельным модулем. Должно быть просто post=$1, насколько я успел понять философию этой говно-CMS. В любом случае решать вам, конечно же :)

znenyegvkby
()
Ответ на: комментарий от emva

Забыл сказать. Правило

RewriteRule ^news/([^/.]+)/?.html$ index.php?id=news&post=$1 [L]
В файле htaccess должно быть выше этого правила
RewriteRule /?([A-Za-z0-9_-]+).html$ index.php?id=$1 [QSA,L]
Лучше непосредственно над ним поместите и выделите отдельный блок комментами для редиректов с *.html, ибо вставляя костыли вам еще много придется писать таких правил для разных модулей.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Не совсем понял про переустановку.

Что может измениться, если я удалю установленный модуль и заново установлю?

emva
() автор топика
Ответ на: комментарий от znenyegvkby

Эта недо ЦМС достаточно быстро и просто справляется со своими задачами.

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

Дизайн настраивается тупо копирование футера и хэдера.Не надо замарачиваться с верстками шаблона на друпал или вордпресс.

emva
() автор топика
Ответ на: комментарий от emva

Не сам плагин, а уже установленный вами модуль. Может быть изменить суффиксы, которые вы используете. Просто сейчас у вас получается что страницы из модуля «Новости», загружаются со страницы из модуля «Страницы -> Управление страницами». То есть где-то там, скорее всего, у вас создана страница с id=news, и от нее работают все новостные страницы. Я поставил плагин сейчас, у меня модуль «из коробки» работает отдельно. То есть (для наглядности покажу без ЧПУ), если я, допустим, создают страницу с суффиксом 12345, мой адрес будет выглядеть так - ://test_for_emva/?post=12345, у вас же, он будет выглядеть так - ://yout_site/?id=news&post=12345. Вы можете запутаться впоследствии, если страниц будет создано достаточно много.

znenyegvkby
()
Ответ на: комментарий от emva

Нет, нет. Я высказался всего-лишь по поводу говно-кода в кишках. Это «профессиональное» как говорится, не заморачивайтесь. Сама CMS действительно довольна простая + не требует базы данных. Я конечно же порекомендовал бы вам использовать какой-нить легкий фреймворк + базу, но для этого нужно писать. Вам же, насколько я понял, нужна именно CMS. По сравнению с друпалами/жумлами/прессами она действительно очень простая.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Не могу понять, почему не работает из коробки.

Логика правильная - сама цмс генерирует свои страницы, а плагин свои.

emva
() автор топика
Ответ на: комментарий от emva

Потому что у вас в настройках модуля «Редактор новостей», в поле «Адрес страницы новостной ленты:» выставлена какая-то страница с id=news. А эта CMS на каждый такой чих, заново генерирует .htaccess. Я только что проверил, создал страницу «Новости» с id=news, зашел в настройки модуля «Редактор новостей» и выбрал ее как главную. И CMS мне сгенерировала новые правила

# News Manager:
 RewriteRule ^news/tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=dfgdf&tag=$1&page=$2 [L]
 RewriteRule ^news/tag/([^/.]+)/?$ index.php?id=dfgdf&tag=$1 [L]
 RewriteRule ^news/post/([^/.]+)/?$ index.php?id=dfgdf&post=$1 [L]
 RewriteRule ^news/page/([^/.]+)/?$ index.php?id=dfgdf&page=$1 [L]
 RewriteRule ^news/archive/([^/.]+)/?$ index.php?id=dfgdf&archive=$1 [L]
 # end News Manager
То есть видите как модуль работает, он просто для всех подстраниц модуля добавляет id привязанной вами страницы. Вы затерли правило ^news/post, но они используют второй уровень для идентификации сущностей (метка, запись, страница при пагинации, архив), поэтому вы не сможете смотреть новости с id=tag|page|archive, более того, если ваше правило ?news/(... будет выше правил tag/page/archive, вы не сможете пользоваться и остальным функционалом модуля. И это только проблемы вытекающие из смены одного правила :)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Спасибо огромное. Теперь вроде как детские болячки разобраны, дело за развитием сайта.

emva
() автор топика
Ответ на: юноша от olsv64

девочка, свой говносайт можешь рекламировать среди любителей аниме.

emva
() автор топика
Ответ на: комментарий от znenyegvkby

Снова привет тебе, znenyegvkby.

Выплыла еще одна проблема: Когда закончилась первая страница новостей, на вторую перейти нельзя - генерируется урл ../news/page/2 и на нем:

Not Found The requested URL /news/page/2 was not found on this server.

emva
() автор топика
Ответ на: комментарий от emva

Привет. Ты скидывал все правила выше. Вот тот блок .htaccess, что нужен тебе сейчас.

# News Manager:
 RewriteRule ^news^tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news^tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]
 RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news^archive/([^/.]+)/?$ index.php?archive=$1 [L]
Обрати внимание что правило
RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]
Находится выше по списку, нежели правило
RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
А все правила редиректа в htaccess обрабатываются строго по порядку. Следовательно, отрабатывает первое правило, и ищет новость со slug=page, которая явно не существует.
Поэтому все что нужно сделать, это переместить правило с ^news^page/([^/.]+)/?$ выше правила с ^news/([^/.]+)/?$. Можешь сразу поставить правило ^news/([^/.]+)/?$ в конец блока, чтобы archive так же работал. То есть конечный вид твоего блока будет выглядеть вот так
# News Manager:
 RewriteRule ^news^tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news^tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news^archive/([^/.]+)/?$ index.php?archive=$1 [L]
 RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]
Ну и очевидно, что новостей с slug=tag | page | archive быть не должно. Надеюсь объяснил доступно.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Сейчас у меня так и не работает.

# handle rewrites for fancy urls
<IfModule mod_rewrite.c>
	RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ https://%1/$1 [L,R=301]

	# Usually RewriteBase is just '/', but 
	# replace it with your subdirectory path
	RewriteBase /

# News Manager:
 RewriteRule ^news^tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news^tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news^archive/([^/.]+)/?$ index.php?archive=$1 [L]
 RewriteRule ^news/([^/.]+)/?$ index.php?id=news&post=$1 [L]
 RewriteRule ^news/([^/.]+)/?.html$ index.php?id=news&post=$1 [L]
 # end News Manager
	
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule /?([A-Za-z0-9_-]+).html$ index.php?id=$1 [QSA,L]
</IfModule>

emva
() автор топика
Ответ на: комментарий от emva

Все верно, извиняюсь, символ «^» не заметил. Видно неверно сгенерировала CMS. Замените ^ на /. То есть вместо

 RewriteRule ^news^tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news^tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news^page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news^archive/([^/.]+)/?$ index.php?archive=$1 [L]
Используйте
 RewriteRule ^news/tag/([^/.]+)/page/([^/.]+)/?$ index.php?id=news&tag=$1&page=$2 [L]
 RewriteRule ^news/tag/([^/.]+)/?$ index.php?tag=$1 [L]
 RewriteRule ^news/page/([^/.]+)/?$ index.php?page=$1 [L]
 RewriteRule ^news/archive/([^/.]+)/?$ index.php?archive=$1 [L]

znenyegvkby
()
Ответ на: комментарий от emva

Так, ну давайте разбираться.
Во-первых, вы же все страницы сделали с .html-окончанием, за что у вас отвечает следующее правило

RewriteRule /?([A-Za-z0-9_-]+).html$ index.php?id=$1 [QSA,L]
На странице https://bankrot.am/news/page/2.html 404, значит, скорее всего до модуля доходит, но не срабатывает, ибо 2.html как номер, скорее всего берется целиком.
Для начала скажите мне, что вы хотите получить - страницу с .html на конце как везде, или без .html. От этого и будем плясать, если с .html то я скажу где в коде можно домпануть, чтобы протестировать работу модуля.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Откройте https://bankrot.am/news.html и мотайте вниз

Видите страницы 1 и 2?

страница https://bankrot.am/news/page/2.html - такой не и не надо-)

Если же возвращаться с названием страниц, то в идеале хотелось бы видеть что то вроде https://bankrot.am/news/page2

emva
() автор топика
Ответ на: комментарий от emva

Если же возвращаться с названием страниц, то в идеале хотелось бы видеть что то вроде https://bankrot.am/news/page2

Для этого точно придется переписывать функцию nm_show_post, которую вы правили до этого, но раз там внутри жуткий говнокод и напрочь отсутствуют тесты, то такие изменения могут вызвать длинную цепочку непредвиденных поломок, сл-но, пока лучше оставить эту затею :)

https://bankrot.am/news/page/2.html

Хорошо, если такой не нужно, давайте пробовать https://bankrot.am/news/page/2. Для этого мне нужно понять - срабатывает ли роутер как надо. Т.е. доходит ли до нужной функции в модуле в данном случае. Это, насколько я понимаю по беглому осмотру кода - функция nm_show_page (в этом месте я тихо плачу что кода нет на каком-нибудь гитхабе/битбакете/etc :)).
То есть, элементарно, без всякого дампа, вставьте в файл /site/plugins/news_manager/inc/site.php на вашем локальном проекте после 14 строки какой-нибудь die(1);. Примерно так:

/*******************************************************
 * @function nm_show_page
 * @param $index - page index (pagination)
 * @param $filter - if true, apply content filter
 * @action show posts on news page
 */
function nm_show_page($index=NMFIRSTPAGE, $filter=true) {
    die(1);
    ...
После этого откройте нужную страницу ( https://bankrot.am/news/page/2 ) и отпишите, доходит или нет. Вам сейчас только такой метод отладки поможет, лучшего тут не подобрать судя по коду что я вижу :)

znenyegvkby
()
Ответ на: комментарий от emva

Нет, я им не пользуюсь. Я если помогаю, то только здесь :) Может тебе в job сходить? Там работы на 15 минут, может PHP-ники сделают тебе рублей за чисто символическую сумму. Им же тоже кушать хочется :)

znenyegvkby
()
Ответ на: комментарий от emva

Да, а теперь вы схватили ошибку, но в настройках, скорее всего отключен их показ. Поэтому пустой ответ. Страница:
https://bankrot.am/news.html
Вот в чем проблема таких CMS - поменяешь в одном месте, отваливается в другом. И так по кругу. Вот реально - ваш сайт написать на каком-нибудь Yii/Symphony/etc + mysql/postgresql/etc - 3 часа времени. Без всяких шуток :) И это будет работать как часы, и любое добавление нового функционала будет происходить совершенно безболезненно. Но раз вы не знаете ЯП/паттерны проектирования/etc, вам приходится использовать CMS, что абсолютно логично.
Я бы порекомендовал вам все же переписать пока не поздно на какой-нить опухший друпал/вордпресс. Там хотя бы уже все эти мелочи давно отточены, а тут все же малоизвестная CMS. Вы в будущем еще кучи таких мелочей будете ловить. Поверьте. А с теми же друпал/вордпресс, их будет намного меньше. Да и сообщество (в том числе и русскоязычное) для таких CMS просто огромно, поэтому практически на любой вопрос вам уже будет готовое решение :)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

По большому счету, все что есть устраивает.

На сайте не нужно больше ничего.

Смысле заказывать верстку к вордпрессу для переноса дизайна? Нужно то, что бы вторую страницу показывало...

emva
() автор топика
Ответ на: комментарий от emva

Тогда вот RewriteRule (комментарий).
Делайте как написано, и смотрите, если после изменений в коде https://bankrot.am/news/page/2 так же открывается, значит роутинг до нужной функции в модуле не доходит, получается нужно смотреть сам роутинг, он у них простой - сразу в файле index.php в корне сайта находится, ЕМНИП. Я просто не могу воспроизвести сейчас эту проблему, т.к. не на тест машине, на которой я ставил вашу CMS. На ней буду вечером, после 7 по Мск, там точнее смогу сказать :)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Так я это делал еще вчера.

Страница https://bankrot.am/news/page/2 так же открывается и отображается на ней главная страница. И при это сама страница новостей не открывается.

Вот сейчас я тоже изменения внес - можете посмотреть

emva
() автор топика
Ответ на: комментарий от emva

Ага, понял. Значит роутинг до самого модуля не срабатывает. Нужно смотреть в роутинге главной страницы. Я как до тест-машины домой доберусь, отпишу вам что и где нужно будет изменить.

znenyegvkby
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.