У меня есть веб-сайт, который отвечает на * .domain.com.
Переход на x.domain.com
или y.domain.com
должен создать одну и ту же веб-страницу.
Что я не знаю, но это и важная часть информации, так как мы отслеживаем вещи, основанные на ней.
При переходе на WordPress мы столкнулись с довольно серьезной проблемой. Кажется, он создает ссылки (используя get_page_link) с доменом, установленным в admin.
Это не сработает для нас, потому что мы не можем найти способ сказать wordpress для создания ссылок без домена (почему это все равно ?!), и каждый раз, когда нажимается ссылка, браузер переходит от: x.domain.com
на domain.com
(поскольку domain.com – это то, что у нас есть в админке).
К сожалению, WordPress архивирован таким образом, что очень сложно избавиться от компонента домена URL. Но еще не все потеряно! Читайте дальше, поскольку ответ на ваш вопрос требует немного фона.
Команда WordPress приняла решение потребовать от пользователя сайта жесткого кодирования домена сайта либо в базе данных через консоль администратора, которую вы можете увидеть на следующем скриншоте, через PHP, о котором мы поговорим ниже:
Вы можете спросить, какая разница между двумя URL-адресами? Даже я нахожу это сбивающим с толку, потому что мне почти никогда не нужно что-то другое, чтобы они оба установили корневой URL-адрес, и, поскольку это не важно для вашего вопроса, я просто замаскирую эту деталь. Если вас это интересует, вы можете узнать больше здесь:
wp-config.php
: адрес WordPress (URL) Двигаясь вперед, другой вариант состоит в том, чтобы жестко закодировать две константы PHP WP_SITEURL и WP_HOME в файле /wp-config.php
которые можно найти в корневом /wp-config.php
установки WordPress. Эти две строки могут выглядеть так в файле /wp-config.php
:
define('WP_HOST','http://domain.com'); define('WP_SITEURL','http://domain.com');
Хорошей новостью является то, что вы можете определить их динамически на основе текущего домена, на котором работает ваш сайт (я предполагаю, что у вас есть как ваш DNS-сервер, так и ваш веб-сервер Apache, настроенный для подстановочных DNS .) Вы можете использовать следующий код для соответствия любому имени поддомена, состоящему из букв и цифр:
$root_domain = 'domain.com'; // Be sure to set this to your 2nd level domain!!! $this_domain = $_SERVER['SERVER_NAME']; if (!preg_match("#^([a-zA-Z0-9]+\.)?{$root_domain}$#",$this_domain)) { echo "ERROR: The domain [$this_domain] is not a valid domain for this website."; die(); } else { define('WP_HOME',"http://{$this_domain}"); define('WP_SITEURL',"http://{$this_domain}"); }
Плохая новость заключается в том, что у вас могут быть некоторые « артефакты », с которыми можно будет справиться после того, как вы его заработаете, например, как обрабатывать URL-адреса для URL-адресов изображений, хранящихся в содержимом базы данных (что может или не может быть проблемой) или для API Карт Google ключи и т. д. Если у вас есть проблемы с ними, позвольте мне предложить вам опубликовать еще один вопрос здесь или даже лучше в новом WordPress Answers Exchange, который также запускается теми же людьми, что и StackOverflow.
Что касается сообщения WordPress о том, как создавать ссылки, есть фильтры, которые вы можете « зацепить », но в моем быстром тестировании я не думаю, что вам это нужно, потому что WordPress будет генерировать ссылки для любого домена, который является вашим текущим доменом. Тем не менее, если вы обнаружите, что вы в них нуждаетесь, вы можете сделать это, хотя будьте готовы к тому, чтобы быть подавленным всеми необходимыми add_filter()
! Каждый из них контролирует один из способов, по которым ссылки могут быть созданы в WordPress.
Вот функция фильтра hook и 40+ add_filter()
вызовов; вам могут понадобиться не все, но если вы здесь, то это:
function multi_subdomain_permalink($permalink){ $root_domain = 'domain.com'; $this_domain = $_SERVER['SERVER_NAME']; if (preg_match("#^([a-zA-Z0-9]+)\.?{$root_domain}$#",$this_domain,$match)) { $permalink = str_replace("http://{$match[1]}.",'http://',$permalink); } return $permalink; } add_filter('page_link','multi_subdomain_permalink'); add_filter('post_link','multi_subdomain_permalink'); add_filter('term_link','multi_subdomain_permalink'); add_filter('tag_link','multi_subdomain_permalink'); add_filter('category_link','multi_subdomain_permalink'); add_filter('post_type_link','multi_subdomain_permalink'); add_filter('attachment_link','multi_subdomain_permalink'); add_filter('year_link','multi_subdomain_permalink'); add_filter('month_link','multi_subdomain_permalink'); add_filter('day_link','multi_subdomain_permalink'); add_filter('search_link','multi_subdomain_permalink'); add_filter('feed_link','multi_subdomain_permalink'); add_filter('post_comments_feed_link','multi_subdomain_permalink'); add_filter('author_feed_link','multi_subdomain_permalink'); add_filter('category_feed_link','multi_subdomain_permalink'); add_filter('taxonomy_feed_link','multi_subdomain_permalink'); add_filter('search_feed_link','multi_subdomain_permalink'); add_filter('get_edit_tag_link','multi_subdomain_permalink'); add_filter('get_edit_post_link','multi_subdomain_permalink'); add_filter('get_delete_post_link','multi_subdomain_permalink'); add_filter('get_edit_comment_link','multi_subdomain_permalink'); add_filter('get_edit_bookmark_link','multi_subdomain_permalink'); add_filter('index_rel_link','multi_subdomain_permalink'); add_filter('parent_post_rel_link','multi_subdomain_permalink'); add_filter('previous_post_rel_link','multi_subdomain_permalink'); add_filter('next_post_rel_link','multi_subdomain_permalink'); add_filter('start_post_rel_link','multi_subdomain_permalink'); add_filter('end_post_rel_link','multi_subdomain_permalink'); add_filter('previous_post_link','multi_subdomain_permalink'); add_filter('next_post_link','multi_subdomain_permalink'); add_filter('get_pagenum_link','multi_subdomain_permalink'); add_filter('get_comments_pagenum_link','multi_subdomain_permalink'); add_filter('shortcut_link','multi_subdomain_permalink'); add_filter('get_shortlink','multi_subdomain_permalink'); add_filter('home_url','multi_subdomain_permalink'); add_filter('site_url','multi_subdomain_permalink'); add_filter('admin_url','multi_subdomain_permalink'); add_filter('includes_url','multi_subdomain_permalink'); add_filter('content_url','multi_subdomain_permalink'); add_filter('plugins_url','multi_subdomain_permalink'); add_filter('network_site_url','multi_subdomain_permalink'); add_filter('network_home_url','multi_subdomain_permalink'); add_filter('network_admin_url','multi_subdomain_permalink');
Пока подводит нас к окончательной точке. В WordPress есть функциональность, которая пытается обеспечить, чтобы каждый загруженный URL-адрес был отправлен через его canonical
URL-адрес, который в целом является лучшей практикой в Интернете, особенно если вы заинтересованы в оптимизации результатов поисковой системы в Google и других поисковых системах. В вашем случае, однако, если вы действительно не хотите, чтобы WordPress перенаправлялся на ваш канонический URL-адрес, вам нужно добавить крючок redirect_canonical
фильтра и сообщить WordPress не делать этого.
Ниже приведен код, чтобы убедиться, что любая страница, которая служит « x.domain.com
», остается на « x.domain.com
», даже если все URL-адреса фильтруются как « domain.com
». Это может быть не точная логика, в которой вы нуждаетесь, но я просто показываю вам блоки WordPress, чтобы вы могли найти нужную логику.
Несколько окончательных подробностей об этом вызове функции; параметры # 3 и # 4 относятся соответственно к приоритету (10 – это стандартный приоритет, поэтому этот крючок не будет обрабатываться специальным) и количество аргументов функции (2 аргумента – $redirect_url
и $requested_url
.) Другое дело отметить, что возвращение false
вместо действительного URL-адреса отменяет каноническое перенаправление:
add_filter('redirect_canonical','multi_subdomain_redirect_canonical',10,2); function multi_subdomain_redirect_canonical($redirect_url,$requested_url){ $redirect = parse_url($redirect_url); $requested = parse_url($requested_url); // If the path+query is the same for both URLs, Requested and Redirect, and if ($redirect['path']+$redirect['query']==$requested['path']+$requested['query']) { // If Requested URL is a subdomain of the Redirect URL if (preg_match("#^([a-zA-Z0-9]+).{$redirect['host']}$#",$requested['host'])) { $redirect_url = false; // Then cancel the redirect } } return $redirect_url; }
Вот и все. Надеюсь это поможет.
-Майк
у вас есть какой-то контроль над вашим хостингом? Возможно, вы можете использовать модуль перезаписи в apache, если используете apache.
В httpd.conf добавьте:
RewriteEngine On RewriteCond %{HTTP_HOST} ^x\.domain\.com RewriteRule ^(.*)$ http://www.domain.com/x/$1 RewriteCond %{HTTP_HOST} ^y\.domain\.com RewriteRule ^(.*)$ http://www.domain.com/y/$1
Вы можете изменить способ передачи переменной «v» тоже
RewriteRule ^(.*)$ http://www.domain.com/$1&var=v
Я не пробовал код, но я уверен, что, по крайней мере, он откроет вам новый способ справиться с этой проблемой – один, который не требует большого количества кодирования.
Приветствия.
A.