Настройка WordPress с пользовательскими постоянными ссылками и без файла.htaccess?


У меня есть клиент, который настоятельно предпочитает отключать файлы .htaccess, потому что им нравится самостоятельно настраивать конфигурации Apache. Тем не менее, им все еще нужны SEO-дружественные URL-адреса.

Есть ли способ создать пользовательские постоянные ссылки без файла .htaccess? Мои исследования до сих пор, похоже, показывают, что это невозможно, но, возможно, один из блестящих разработчиков знает, как может быть возможно кажущееся невозможным. Заранее спасибо!

Author: hakre, 2010-08-28

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, но если вас интересует это направление, вот несколько ссылок для поиска:

 15
Author: MikeSchinkel, 2010-08-29 05:10:40

Постоянные ссылки без mod_rewrite

Без файла.htaccess или изменения файла httpd.conf лучшее, что вы можете сделать, - это постоянные ссылки pathinfo. Постоянные ссылки Pathinfo такие же, как и постоянные ссылки pretty, за исключением того, что они начинаются с index.php .

Чтобы использовать постоянные ссылки pathinfo, поместите index.php / в начале вашей пользовательской структуры постоянных ссылок:

/index.php/%postname%/

Смотрите статью Кодекса для получения дополнительной информации.

 2
Author: Chris_O, 2010-08-29 01:13:17

В Старые добрые времена 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 самостоятельно или просят вас изменить файл. Это решение, возможно, подходит не всем, но его стоит рассмотреть.

 0
Author: Annika Backstrom, 2010-08-29 04:03:43