htaccess переписать и перенаправить для SEO дружественных URL - PullRequest
0 голосов
/ 12 января 2019

Я знаю, что этот вопрос мог быть дублирован или на него уже давали ответы, но я читал сайт apache.org и видел много других похожих ответов, и пока не могу найти правильного решения своей проблемы, поскольку я новичок в .htaccess и apache.

Для простоты предположим, что URL моего сайта: https://www.example.com

Главная страница - index.php, и есть форма для отправки с 3 элементами выбора / выпадающих меню с именами: sp, ar и in. sp является обязательным (пользователь должен ввести значение), ar и in являются необязательными.

Когда я отправляю форму, файл results.php выполняется. Когда все 3 раскрывающихся списка имеют значения, форма отправляемого URL-адреса:

1) https://www.example.com/results.php?sp=textvalue1&ar=textvalue2&in=textvalue3

Кроме того, в зависимости от того, имеют ли значения ar и in (или не имеют), другие возможные формы URL:

2) https://www.example.com/results.php?sp=textvalue1&ar=&in= 
3) https://www.example.com/results.php?sp=textvalue1&ar=textvalue2&in= 
4) https://www.example.com/results.php?sp=textvalue1&ar=&in=textvalue3 

Я хочу преобразовать эти "уродливые" URL-адреса в оптимизированные для SEO URL-адреса.

Для случая 1 (все 3 раскрывающихся списка имеют значения) я хотел бы отправить форму и увидеть в поле URL моего браузера:

(case 1) https://www.example.com/textvalue1/textvalue2/textvalue3

и получите те же результаты (важно)!

Точно так же я хочу, чтобы другие оптимизированные для SEO URL были:

(case 2) https://www.example.com/textvalue1
(case 3) https://www.example.com/textvalue1/textvalue2
(case 4) https://www.example.com/textvalue1/textvalue3

Я предполагаю, что мне нужно сделать 2 вещи: во-первых, преобразовать уродливый URL-адрес в SEO-ориентированный URL-адрес и, во-вторых, обработать новый SEO-дружественный URL-адрес, как если бы он был старым уродливым.

До сих пор я пробовал следующие команды в моем файле .htaccess для случая 2, но ничего не произошло:

Options +FollowSymlinks -Indexes -MultiViews
RewriteEngine On
RewriteCond %{THE_REQUEST} \s/results\.php\?sp=([a-zA-Z]+)\s [NC]
RewriteRule ^ /%1? [R=302,L]
RewriteRule ^/([[a-zA-Z]]+)$ /results.php?sp=$1 [L]

1 Ответ

0 голосов
/ 12 января 2019

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

RewriteEngine on

RewriteCond %{REQUEST} !-f
RewriteCond %{REQUEST} !-d
RewriteRule ^/?([^/]+)/([^/]+)/([^/]+)$ /results.php?sp=$1&ar=$2&in=$3 [END]
RewriteRule ^/?([^/]+)/([^/]+)$ /results.php?sp=$1&ar=$2 [END]

RewriteCond ${QUERY_STRING} ^sp=(.+)&ar=(.+)&in=(.+)$  
RewriteRule ^/results\.php$ /%1/%2/%3 [R=301,END]
RewriteCond ${QUERY_STRING} ^sp=(.+)&ar=(.+)$  
RewriteRule ^/results\.php$ /%1/%2 [R=301,END]

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

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

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

...