Перенаправить, если URL не содержит строку, оставшаяся часть URL не повреждена - PullRequest
0 голосов
/ 22 октября 2018

Таким образом, мы пытаемся перенаправить старый поддомен на наш новый домен и сохранить оставшуюся часть URL без изменений.Мы пытаемся переместить все это в подкаталог.

Это легко сделать с помощью следующего ...

RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

Однако, некоторые из предыдущих сайтов URL уже были test.example.com/test-path/.поэтому мы бы хотели, чтобы эти числа не удваивались на /test-path/

. Это правило превращает URL-адреса, подобные этим ...

test.example.com/test-path/some-page

в

test.example.com/test-path/test-path/some-page

Итак, теперь мы пробуем следующее ...

RewriteCond %{REQUEST_URI} !/test-path/
RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

И хотя это будет перенаправлять на example.com/test-path/, теперь оно теряет все, что пришло после обычного URL.

test.example.com/test-path/other-path

перенаправляется на

example.com/test-path/

Надеюсь, это имеет смысл в том, что мы пытаемся сделать.Перенаправьте поддомен в новый домен в подкаталог, а не удваивайте каталог request-url.

Редактировать:

При этой последней попытке он также не 'Кажется, все равно, если URL содержит /test-path/.Это все еще перенаправляет в любом случае.

1 Ответ

0 голосов
/ 23 октября 2018
RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

Я предполагаю, что это просто опечатка в вашем вопросе (?), Но у вас есть ошибочная косая черта в конце имени вашего хоста - это никогда не будет совпадать.

Чтобы избежать дублирования /test-path, когда оно присутствует в запрошенном URL-адресе, но все еще перенаправлено на /test-path, вы можете зафиксировать его как необязательный URL-путь, который затем отбрасывается, если он совпадает.Например:

RewriteCond %{HTTP_HOST} ^test\.example\.com [NC]
RewriteRule ^(?:test-path/)?(.*) https://example.com/test-path/$1 [R=302,L]

Я удалил косую черту и завершающий $ на CondPattern , чтобы он совпадал (и, следовательно, канонизировался) с полным доменным именем, заканчивающимся точкой.

(?:test-path/)? - это группа без захвата (поэтому обратная ссылка не создается), которая захватывает test-path/.Затем эта группа становится необязательной с конечным ?.


В стороне:

RewriteCond %{REQUEST_URI} !/test-path/
RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

Это ничего не изменит, если /test-path/присутствует в любом месте запрошенного URL.Так что, если вы видите перенаправление, тогда может показаться, что «что-то еще» делает это!

С этой последней попыткой, вам также не важно, содержит ли URL-адрес /test-path/совсем.В любом случае, он все еще перенаправляет.

Как я уже сказал, что-то еще должно делать это.Возможный конфликт с другими директивами возможно?Смешиваете ли вы перенаправления из mod_alias и mod_rewrite?

Обратите внимание, что эти перенаправления должны идти вверху файла .htaccess.

...