2016-05-14 2 views
1

В .htaccess, мне нужно удалить строку запроса,RewriteRule Удалите строку запроса

?lang=ca, from ca/blog/?lang=ca 

Said по-другому, я хочу, чтобы перенаправить из:

www.example.com/ca/blog/?lang=ca 

в

www.example.com/ca/blog/ 

Это две разные вещи, которые я пробовал:

RewriteRule ^ca/blog/ /ca/blog/? [L,R=301] 
RewriteRule ^ca/blog/$ /ca/blog/ [QSD] 

Что не так с моими параметрами и как это сделать правильно?

(.. ca/blog/?lang=ca не существует Вот почему сейчас мне нужно перенаправить ca/blog/ Если я не перенаправляет Google, считает, что это две разные страницы)

Документация объяснить, как удалить строку запроса:

https://wiki.apache.org/httpd/RewriteQueryString

Но я не знаю, как применить к моему делу или то, что я пытался не работает

Мой второй раствор использует флаг [QSD] Сброс строки запроса. Возможно, есть что-то я не понимаю, потому что она не работает либо

+0

сообщение весь URL пожалуйста – sjsam

+0

@sjsam: Я обновил этот вопрос со всей URL – segon

+0

The questios не ясно , Вы хотите, чтобы пользователи увидели 'www.myDomain.com/ca/​​blog /' правильно? – sjsam

ответ

0

Вы можете использовать это правило в корневом .htaccess:

RewriteEngine On 

RewriteCond %{QUERY_STRING} ^lang= [NC] 
RewriteRule ^(ca/blog/?)$ %{REQUEST_URI}? [NC,L,R=301] 
+0

Ваше решение очень сложно. См. Документацию: https://wiki.apache.org/httpd/RewriteQueryString – segon

+0

Да, я неоднократно читал эти документы. Просто удаление строки запроса довольно просто, и вы можете сделать это только с одним правилом: 'RewriteRule^ca/​​blog /? $ $ 0? [L, R] ', но затем он удалит любую строку запроса, а не только' lang = 'и'? Lang = 'также не будет доступен внутри. – anubhava

+0

Почему это не работает? RewriteRule^ca/​​blog /? Lang = ca/​​ca/​​blog /? [L, R = 301] – segon

0

В самом начале проверки, если

LoadModule rewrite_module modules/mod_rewrite.so 

является раскомментировать в файле httpd.conf. Когда апач работает проверка:

httpd -M | grep rewrite 

, чтобы убедиться, что mod_rewrite действительно включен. После того, как эти условия действительно будут удовлетворены ниже работы.

Разбитое URL:

http://www.example.com/ca/blog/?lang=ca 

Правило

RewriteEngine On 
RewriteCond  %{QUERY_STRING} ^lang=ca$ 
RewriteRule (.*)/ $1/? [R=permanent] 

Сервер будет получать этот

http://www.example.com/ca/blog/ 

Объяснение

  1. В RewriteCond мы проверяем, если строка запроса lang является ca.

  2. Если условие выполнено, мы добавляем в конце пустую строку запроса ?. И поскольку ваш оригинальный URL-адрес сломан, мы помещаем R=permanent, чтобы сообщить серверу, что перенаправление является постоянным.

+0

Вопрос об удалении строки querry – segon

+0

Помните, что я прошу перейти от ca/​​blog /? lang = ca to ca/​​blog/ – segon

+0

@segon: Я обновил ответ в соответствии с вашими требованиями. Пожалуйста, lemme знаю, это работает – sjsam

0

Строка запроса не является частью того, что вы соответствуете правилу перезаписи. Если вы хотите сопоставить что-либо в строке запроса, вам нужна директива RewriteCond, ограничивающая следующий RewriteRule указанным вами условием.

Например:

RewriteCond lang=cr %{QUERY_STRING} 
RewriteRule ^/foo /foo [R=301] 

Это будет перенаправлять /foo?lang=cr к /foo, но /foo?lang=en и /foo останутся без изменений.

Конечно картина, возможно, придется быть немного строже, потому что он также будет соответствовать /foo?langlang=crown, но тем не менее ...

Кстати, было бы легче осуществить это в вашей логики приложения, а не в .htaccess ....

+0

Я не понимаю вашего ответа. Название моего вопроса - удалить строку. Как ваш ответ решает это? – segon

+0

Если вы хотите сопоставить что-то в строке запроса (что вы делаете, в частности, указано ли lang), вам нужно добавить RewriteCond, выполняя это совпадение, вы не сможете решить его только с помощью RewriteRules. –

+0

Ответьте ли ваш ответ на строку querry? – segon

Смежные вопросы