Проблема с модом переписать Правила в htaccess - PullRequest
0 голосов
/ 10 апреля 2019

Я открываю новый сайт и хочу переписать некоторые файлы с параметром в URL.

Сайт сейчас не работает, и, к сожалению, у меня нет большого опыта работы с mod_rewrite.

Так в чем моя проблема:

У меня есть два файла: category.php и single.php

в моем индексе, у меня есть меню, которое ссылается на все категории через URL-параметр,Например, на sitename.com / index.php вы найдете ссылки на:

sitename.com / category.php? C = Первая
sitename.com/category.php? c = Second
sitename.com/category.php?c=Third
и т. д.

На сайте sitename.com/category.php?c=First, например, вы найдетесписок всех сообщений, которые относятся к категории в первую очередь и связаны с:

sitename.com / single.php? c = Frist & name = name1
sitename.com/single.php?c=Frist&name= name2
sitename.com/single.php?c=Second&name=name3
sitename.com/single.php?c=Third&name=name4
и т. д.

сейчася пытаюсь переписать URL-адреса в следующую структуру:

sitename.com / category.php? c = Первый => sitename.com/First
sitename.com/category.php?c= Second => sitename.com/Second
sitename.com/single.php?c=Frist&name=name2 => sitename.com/First/name2
sitename.com/single.php?c=Second&name=name3=> sitename.com/Second/name3

Я использовал следующую Code

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ categroy.php?c=$1 [L,QSA]
    RewriteRule ^(.*)/(.*)$ single.php?c=$1&name=$2 [L,QSA]
</IfModule>

Каждый RewriteRule работает самостоятельно, но вместе я не получу ожидаемых результатов.

так что я попробовал сервал дней и не понимаю.
Так что надеюсь, что кто-то здесь может помочь

Большое спасибо

1 Ответ

0 голосов
/ 10 апреля 2019

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

Вот модифицированная версия, чтобы указать вам правильное направление:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [END]

RewriteRule ^/?(\w+)/(\w+)/?$ single.php?c=$1&name=$2 [END,QSA]
RewriteRule ^/?(\w+)/?$ category.php?c=$1 [END,QSA]

В случае, если вы получаете внутреннюю ошибку сервера (http status 500), используя приведенное выше правило, есть вероятность, что вы используете очень старую версию apache http server. В этом случае вы увидите определенный намек на неподдерживаемый флаг [END] в файле журнала ошибок http-серверов. Вы можете попробовать обновить или использовать более старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от ваших настроек.

Эти правила будут работать аналогичным образом в конфигурации хоста http-серверов или внутри файла динамической конфигурации (файл ".htaccess"). Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на хосте http. Если вы используете динамический файл конфигурации, вам нужно убедиться, что его интерпретация вообще включена в конфигурации хоста и находится в папке хоста DOCUMENT_ROOT.

И общее замечание: вам всегда следует размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess"). Эти динамические конфигурационные файлы добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

...