Как читать специальные символы с RewriteCond? - PullRequest
0 голосов
/ 05 апреля 2019

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

Это то, что я смог придумать:

.htaccess вид определенных настроекследующим образом:

RewriteRule ^(\w+)/?$ ?module=$1
RewriteRule ^(\w+)/(\w+)/?$ ?module=$1&action=$2
RewriteRule ^(\w+)/(\w+)/\?id=(\w+)$ ?module=$1&action=$2&id=$3 [L]

Реальный адрес, который работает:

https://example.com/?module=character&action=view&id=500001

При активированном чистом URL он становится:

https://example.com/character/view/?id=500001

С текущими настройками .htaccess, как показано выше https://example.com/character/view/ работает просто отлично, в то время как все, что приходит после, не работает.(? id = 500001)

Я пытался правильно прочитать? id = с последним RewriteRule, но не смог заставить его работать.Возможно, я неправильно понимаю, как я могу писать специальные символы в RewriteRule, вопросительном знаке в данном конкретном случае.

Прочитал несколько руководств и информационных страниц, но не совсем обернулся вокруг этого, потому чтоЯ никогда не находил что-то о специальных символах.

Ввод этого текста напрямую или в скобках также, похоже, не принес желаемого результата.

Надеясь на некоторое понимание этого наиболее вероятного нубистского вопроса.

Спасибо

1 Ответ

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

Всё после первого? в URL считается строкой запроса GET и как таковая не является частью строки, с которой сопоставляется шаблон RewriteRule. Для этого вы можете использовать RewriteCond, но в любом случае это сомнительно, поскольку используемый вами URL-адрес не является чистым в том смысле, в котором большинство людей называют его «дружественным для SEO».

RewriteEngine on
RewriteRule ^/?(\w+)/?$ /?module=$1 [END]
RewriteRule ^/?(\w+)/(\w+)/?$ /?module=$1&action=$2 [END]
RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)(?:&|$)
RewriteRule ^/?(\w+)/(\w+)/?$ /?module=$1&action=$2&id=%1 [END]

Вместо этого ваш URL должен читаться как https://example.com/character/view/500001, что упрощает:

RewriteEngine on
RewriteRule ^/?(\w+)/?$ ?module=$1 [END]
RewriteRule ^/?(\w+)/(\w+)/?$ ?module=$1&action=$2 [END]
RewriteRule ^/?(\w+)/(\w+)/(\d+)$ ?module=$1&action=$2&id=$3 [END]

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

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

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


Да, и кстати:

Нет такой вещи, как «специальные символы», перестаньте вести себя так, как будто есть хорошие и плохие символы. Есть только персонажи. Сегодняшним стандартом является Unicode или, по крайней мере, UTF-8. Эта кодировка определяет примерно 108000 символов, все они одинаково действительны и нормальны, ни один из них не является «специальным». ; -) * 1 021 *

...