Назад | Перейти на главную страницу

htaccess заменить часть url-адреса в зависимости от условия

Я хочу перенаправить с URL-адреса, например http://www.example.de/this.xml

К .xml с правильным языком, например. http://www.example.de/this-www.example.de.xml

То же самое и с любым другим языком, т.е. (de | com | eu ...)

Прямо сейчас у меня есть это, но я не знаю, как установить правильный язык в RewriteRule:

RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.(de|at|ch|com|nl|be|fr)$
RewriteCond %{REQUEST_URI} ^/this.xml$
RewriteRule ^(.*)$ /this-www.mydomain.$1(de|at|ch|com|nl|be|fr)$2.xml [R=301,L]

Вам нужно специально проверять ccTLD? Похоже, вы просто копируете хозяин в целевой URL-путь?

Попробуйте что-нибудь вроде следующего:

RewriteRule ^(this)(\.xml)$ /$1-%{HTTP_HOST}$2 [R=301,L]

Это навсегда перенаправит запрос на http://www.example.de/this.xml к http://www.example.de/this-www.example.de.xml.

Обратите внимание, что если вы ранее тестировали с 301, вам нужно будет убедиться, что все промежуточные кеши очищены с любого более раннего ошибочный 301 будут кэшированы. (По этой причине иногда может быть полезно тестирование с 302).


Но как бы вы проверили конкретно ccTLD?

Чтобы разрешить только несколько избранных ccTLD, а также захватить TLD из хозяин тогда вам нужно будет использовать RewriteCond директиву и проверьте соответствие HTTP_HOST серверная переменная, аналогичная тому, что вы сделали. Однако ваш RewriteRule замена неправильно.

Например, вы можете сделать что-то вроде:

RewriteCond %{HTTP_HOST} ^(www\.)?example\.(de|at|ch|com|nl|be|fr)$
RewriteRule ^(this)(\.xml)$ /$1-%2$2 [R=301,L]

Это перенаправит http://www.example.de/this.xml к http://www.example.de/this-de.xml. Но ничего не делать с http://www.example.us/this.xml, поскольку ccTLD не соответствует ни одному из CondPattern.

$1 и $2 являются обратными ссылками на захваченные группы в RewriteRule шаблон. В то время как %2 это обратная ссылка на вторую захваченную группу в последнем совпавшем RewriteCond CondPattern.

NB: вы должны канонизировать домен (т.е. перенаправить на www или без www) ранее в вашей конфигурации, чтобы www. необязательно в приведенном выше регулярном выражении (т.е. (www\.)?) не должно быть необходимости.