Настройка WordPress с пользовательскими постоянными ссылками и без файла.htaccess?
У меня есть клиент, который настоятельно предпочитает отключать файлы .htaccess, потому что им нравится самостоятельно настраивать конфигурации Apache. Тем не менее, им все еще нужны SEO-дружественные URL-адреса.
Есть ли способ создать пользовательские постоянные ссылки без файла .htaccess? Мои исследования до сих пор, похоже, показывают, что это невозможно, но, возможно, один из блестящих разработчиков знает, как может быть возможно кажущееся невозможным. Заранее спасибо!
3 answers
Привет @Майк Ли:
Чтобы ответить на ваш вопрос, полезно понять, как все работает.
Apache Обслуживает URL-адреса, соответствующие файлам и каталогам
Apache предназначен для обслуживания файлов, явно сопоставленных по URL, или для обслуживания index.php
, найденных в каталоге, когда каталог явно сопоставлен.
Но Apache Может обслуживать URL-адреса, сопоставленные регулярным выражением с mod_rewrite
Если вы хотите, чтобы Apache сопоставлял URL-адреса там, где нет реальных каталоги (в случае с WordPress и довольно постоянными ссылками), то у вас должен быть какой-то способ сообщить Apache, как по-другому обрабатывать URL-адреса. И это именно то, для чего был разработан mod_rewrite
; он дает администраторам серверов возможность устанавливать правила для сопоставления URL-адресов с помощью регулярных выражений. Эти правила перенаправляют результат на другие URL-адреса, часто включая фактические файлы .PHP
, а иногда с переданными параметрами URL. В конечном счете правила определяют, что загружаются фактические файлы.
И mod_rewrite
является Сконфигурирован с помощью .htaccess
или httpd.conf
Для настройки mod_rewrite
вы можете сделать это только внутри .htaccess
или в файле httpd.conf
или в одном из файлов, которые он включает, например, потенциально httpd-vhosts.conf
. На самом деле я удивлен, если у вашего клиента есть навыки управления Apache, что они этого еще не знают.
WordPress Всегда использует один и тот же простой .htaccess
Файл
Переходя к тому, что делает WordPress, когда вы устанавливаете постоянные ссылки, WordPress записывает следующее в файл .htaccess
, предполагая, что он доступен для записи ( и в этом первом примере предполагается, что ваш сайт обслуживается из корневого каталога):
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Предостережение: Если Ваш каталог главной страницы WordPress не является корневым
Если ваш сайт вместо этого обслуживается с /blog
тогда записанный файл .htaccess
будет выглядеть так:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
WordPress Перенаправляет все URL-адреса, не соответствующие файлам/каталогам, на index.php
Итак, как вы можете видеть, единственное, для чего WordPress использует .htaccess
, - это сопоставление любой URL-адрес для домен до /index.php
(или /blog/index.php
во 2-м примере) за исключением когда URL-адрес совпадает с фактическим файлом (например, .jpg
/.gif
/.png
изображение, таблица стилей .css
, скрипт .js
и т.д.) или когда он соответствует фактическому каталогу (который, насколько я знаю, не имеет отношения к стандартной установке WordPress.)
В PHP
WordPress Анализирует $_SERVER['REQUEST_URI']
, Чтобы решить, что загружать
Внутри своего кода PHP
WordPress захватывает значение $_SERVER['REQUEST_URI']
, которое содержит полный URL-запрос без домена и схемы (т.Е. Схема http
или https
), а затем анализирует значение, чтобы определить, какой URL был запрошен и, следовательно, какие страницы он должен загрузить.
Обход .htaccess
? Заставьте Apache загружать виртуальные URL-адреса (но удачи с этим!)
Поэтому, если вы хотите каким-то образом обойти .htaccess
, ваша задача будет состоять в том, чтобы заставить Apache отвечать на произвольный URL-адрес, затем загрузить WordPress и установить $_SERVER['REQUEST_URI']
в качестве пути URL плюс параметры; Я подделываю его, но в хорошем смысле. Тем не менее, я знайте, если не знаете никаких способов, которые не были бы слишком сложными для этого.
Вложение /index.php/
(Может быть?!?)
Несмотря на то, что *chris_o* правильно добавляет /index.php/
к вашим URL-адресам, я съеживаюсь всякий раз, когда вижу это. Он добавляет 10 символов к каждому URL-адресу, делая их длиннее и менее значимыми для поисковых систем, но гораздо хуже делает их менее доступными для совместного использования и выглядит загадочно для пользователей. Извини, Крис, я знаю, что ты хотел как лучше, но тьфу!
Создавайте реальные каталоги для каждого URL-адреса (Может быть?)
Одним из способов получить довольно постоянные ссылки, не касаясь Apache, было бы написать скрипт, который сгенерирует фактический каталог для каждого URL-адреса, который вы хотите, а затем сохранит там index.php
, который загрузит WordPress. Конечно, это потребовало бы огромных усилий для получения крошечной выгоды, и это потребовало бы, чтобы сервер имел доступ на запись, что должно быть хуже, чем использование файла .htaccess
.
Мне неприятно признавать, но это то, что я сделал примерно в 1998 году с веб-сайтом на основе .ASP
, когда IIS
не поддержка перезаписи URL-адресов (и даже сегодня это все еще настоящий ПИТА!) Это был уродливый взлом, было больно поддерживать, и я ненавидел это, но URL-адреса, несомненно, были хороши как для пользователей, так и для SEO!
Лучшее решение? Добавьте правила перезаписи в httpd.conf
Вернемся к тому, что, вероятно, является вашим лучшим решением, и @Simon Brown на самом деле рекомендовал это; добавьте свои правила перезаписи в httpd.conf
или один из включенных файлов, таких как httpd-vhosts.conf
(именно так настроен Apache на локальном хосте на моем Mac.) Добавьте следующая директива, позволяющая изменить каталог, чтобы он соответствовал каталогу вашего сайта:
<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
Бонус! С Блокировкой Приходит И Производительность
Этот последний вариант должен устранить любые .htaccess
и вернуть контроль в их руки.
Еще лучше, что он немного более производителен, так как httpd.conf
загружается только один раз при запуске Apache, но .htaccess
файлы загружаются и анализируются при каждом запросе URL!
P.S. Еще одна вещь, которую следует рассмотреть, - это интерфейсный Apache с сервером кэширования, таким как Nginx что, я считаю, становится лучшей практикой для сайтов WordPress с высоким трафиком, которые действительно должны быть эффективными. Это может потребовать настройки зеленого поля, потому что я не думаю, что большинство людей использовали Nginx для перезаписи URL-адресов для Apache, но если вас интересует это направление, вот несколько ссылок для поиска:
- Интегратор прокси-кэша WordPress Nginx
- Использование Nginx как кэширующий прокси с Wordpress+Apache
- Nginx в качестве внешнего прокси-кэша для WordPress
- WordPress, Nginx и WP Супер Кэш
- Nginx и WordPress MU w/wp-супер-кэш
- Как Ускорить Работу WordPress С Помощью Nginx И WP Super Cache
- Правила перезаписи Nginx для плагина общего кэша W3
- Настройка Nginx для WordPress – Красивые URL-адреса и WP Super Кэш
Постоянные ссылки без mod_rewrite
Без файла.htaccess или изменения файла httpd.conf лучшее, что вы можете сделать, - это постоянные ссылки pathinfo. Постоянные ссылки Pathinfo такие же, как и постоянные ссылки pretty, за исключением того, что они начинаются с index.php .
Чтобы использовать постоянные ссылки pathinfo, поместите index.php / в начале вашей пользовательской структуры постоянных ссылок:
/index.php/%postname%/
Смотрите статью Кодекса для получения дополнительной информации.
В Старые добрые времена WordPress требовалось писать новый конфигурационный файл каждый раз, когда вы меняли структуру постоянных ссылок. В современных установках правила перезаписи неизменны:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Все запросы на несуществующие файлы (т. е. пользовательский путь постоянной ссылки, который не соответствует файлу в файловой системе) передается через index.php, и $_SERVER['REQUEST_URI']
сообщает PHP, что на самом деле было запрошено. Ваш клиент может установить правила перезаписи в httpd.conf или.htaccess, и вам не нужно будет изменять их, как вы измените структуру постоянных ссылок.
Некоторые плагины пытаются изменить .htaccess самостоятельно или просят вас изменить файл. Это решение, возможно, подходит не всем, но его стоит рассмотреть.