#.htaccess
#apache #.htaccess #мод-перезапись
Вопрос:
Это не идеально по соображениям SEO — но у меня мало выбора:
Я пытаюсь перенаправить 50 URL-адресов, по одному для каждого из наших Соединенных Штатов, вот так, с:
http://www.example.com/411/states/Alabama.html
Для
https://example.com/wp/myfolder?search_field=stateamp;value=AL
Помимо пересылки на другой URL, мне также нужно выполнить три вещи:
- Добавьте строку запроса
- Принудительно используйте
https
независимо от того, содержался лиhttps
orhttp
в исходном URL-адресе - Не должно иметь значения, заходит посетитель на «www» или нет.
В Интернете есть множество примеров, показывающих обратное (URL с запросом> URL без запроса), но я не смог найти ни одного, идущего в этом направлении.
Я перепробовал довольно много комбинаций, совсем недавно:
RewriteCond %{HTTP_HOST} ^.mydomain.com$
RewriteRule ^411/states/Alabama.html$ https://example.com/wp/myfolder?search_field=stateamp;value=AL [L,R=301]
Ответ №1:
Если у вас такая же проблема, вот что сработало для меня:
RewriteCond %{REQUEST_URI} ^/411/states/Arkansas.html$
RewriteRule ^(.*)$ https://example.com/wp/file-name?search_field=stateamp;value=AR [R=301,L]
Комментарии:
1.Правило, которое вы указали в вопросе, «лучше» (вам просто нужно было удалить
RewriteCond
директиву). Вы должны проверять URL-путь вRewriteRule
шаблоне (как вы делали в вопросе), а не в дополнительнойRewriteCond
директиве.
Ответ №2:
RewriteCond %{HTTP_HOST} ^.mydomain.com$ RewriteRule ^411/states/Alabama.html$ https://example.com/wp/myfolder?search_field=stateamp;value=AL [L,R=301]
В принципе, это правильно, вам просто нужно удалить RewriteCond
директиву (она никогда не будет соответствовать, но, похоже, в любом случае не требуется). Литерал ?
в строке подстановки не обязательно должен быть экранирован обратной косой чертой (но это тоже не проблема).
При перенаправлении с URL-адреса без строки запроса (или такого, где строка запроса вас не интересует) на URL-адрес со строкой запроса не требуется специальной обработки. Просто укажите целевой URL, как написано.
Однако для этой конкретной проблемы перенаправления всех 50 состояний… вместо этого вы могли бы использовать только одно правило и использовать 50 условий ( RewriteCond
директив), по одному для каждого состояния, для поиска «кода состояния». Это помогло бы избежать повторения и было бы более эффективным, поскольку для обработки требуется только одно правило, а не 50.
(Я предположил, что 411
часть URL-адреса — это просто произвольный числовой код, различный для каждого URL-адреса и не обязательный для успешного сопоставления.)
Например:
RewriteCond $1/AL ^Alabama/(..) [OR]
RewriteCond $1/AK ^Alaska/(..) [OR]
RewriteCond $1/AZ ^Arizona/(..) [OR]
RewriteCond $1/AR ^Arkansas/(..) [OR]
RewriteCond $1/CA ^California/(..) [OR]
: etc.
RewriteCond $1/WA ^Washington/(..) [OR]
RewriteCond $1/WV ^West-Virginia/(..) [OR]
RewriteCond $1/WI ^Wisconsin/(..) [OR]
RewriteCond $1/WY ^Wyoming/(..)
RewriteRule ^d /states/([w-] ).html$ https://example.com/wp/file-name?search-field=stateamp;value=%1 [R=301,L]
$1
Обратная ссылка содержит «имя состояния», полученное из URL-пути. (..)
В CondPattern фиксируется соответствующий 2-символьный «код состояния» из тестовой строки.
%1
Обратная ссылка содержит соответствующий «код состояния». В частности, это содержит первую захваченную группу из последнего сопоставленного CondPattern. Все условия являются OR
общими; может совпадать только одно.
Обратите внимание, что последнее условие ( RewriteCond
директива) не имеет OR
флага.
(При этом специально не проверяется наличие пустой строки запроса, поскольку в этом, по-видимому, нет необходимости.)