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

301 Перенаправлять только запросы, не относящиеся к файловой системе, на новый домен

Я хочу использовать .htaccess на сервере Apache для перенаправления на сервер только тех вызовов, которые не являются файлами или папками в файловой системе. Например, если сервер получает запрос на:

http://www.domain.tld/page1.html

И page1.html не является фактическим файлом на сервере, он должен 301 перенаправлять на:

http://new.domain.tld/page1.html

В противном случае он ничего делать не должен. Это возможно? Если да, то как? Если возможно, предоставьте пример кода. Код, который у меня сейчас есть:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.domain\.tld [NC]
Rewriterule ^(.*)$ http://subdomain.newdomain.tld/$1 [L,R=301]

Хотя это и выполняет перенаправление, оно не игнорирует фактические файлы и папки на сервере.

Вот протестированное решение:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.domain\.tld [NC,OR]
RewriteCond %{HTTP_HOST} ^domain\.tld [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Rewriterule ^(.*)$ http://subdomain.newdomain.tld/$1 [L,R=301]

Строки 3 и 4 сообщают apache применять правило, когда запрос идет с www или без него, без учета заглавных или строчных букв. В !-f и !-d в концах строк 5 и 6 соответственно говорят apache избегать применения перенаправления к существующим файлам и каталогам.

Вы можете сделать это с помощью Apache mod_rewrite, что позволяет перенаправлять запросы с помощью RewriteRule директива. Вы можете сделать это условным для существующего файла, используя RewriteCond директива. В документация по mod_rewrite вероятно, хорошее место для начала.