Apache mod_rewrite
Вам нужно: mod_rewrite ,
Описание: Предоставляет механизм перезаписи на основе правил для перезаписи запрошенных URL-адресов наfly.
Вообще говоря, mod_rewrite
работает путем сопоставления запрашиваемого документа с указанными регулярными выражениями, а затем выполняет перезапись URL-адресов внутри (в рамках процесса apache) или извне (в браузере клиентов).Переписать их можно так же просто, как внутренний перевод example.com/foo в запрос для example.com/foo/bar.
Документы Apache включают в себя руководство mod_rewrite
, и я думаю, что некоторые вещи вам нужныделать покрыты в нем. Подробное руководство по mod_rewrite .
Принудительное использование субдомена www
Мне бы хотелось, чтобы оно вызывало "www" перед каждым URL, поэтому это не domain.comно www.domain.com/page
Руководство по перезаписи содержит инструкции для этого в примере Каноническое имя хоста .
Удаление конечных слешей (часть 1)
Я хотел бы удалить все завершающие косые черты со страниц
Я не уверен, почему вы захотите сделать это, поскольку руководство по перезаписи включает пример дляполная противоположность , т. е. всегда включающая косую черту.Документы предполагают, что удаление косой черты может вызвать проблемы:
Проблема косой черты
Описание:
Каждый веб-мастер может спеть песню о проблемеконечной косой черты на URL, ссылающихся на каталоги.Если они отсутствуют, сервер выдает ошибку, потому что если вы скажете /~quux/foo
вместо /~quux/foo/
, то сервер ищет файл с именем foo.И поскольку этот файл является каталогом, он жалуется.На самом деле, он пытается исправить это сам в большинстве случаев, но иногда вам нужно подражать этому механизму.Например, после того, как вы выполнили много сложных переписываний URL-адресов для сценариев CGI и т. Д.
Возможно, вы могли бы подробнее рассказать, почему вы хотите все время удалять косую черту?
Удалить.php
расширение
Мне нужно, чтобы удалить .php
Самая близкая вещь, которую я могу придумать, - это внутренняя перезапись каждого документа запроса с помощьюРасширение .php, т.е. example.com/somepage, вместо этого обрабатывается как запрос для example.com/somepage.php.Обратите внимание, что для выполнения этой процедуры потребуется, чтобы каждая somepage действительно существовала в файловой системе как somepage.php.
При правильной комбинации регулярных выражений это должно быть в некоторой степени возможно.Однако я могу предвидеть некоторые возможные проблемы, связанные с тем, что страницы индексов не запрашиваются правильно и не соответствуют каталогам.
Например, это правильно перезапишет example.com/test как запрос к example.com/test.php:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
Но заставит example.com не загружаться, потому что тамno example.com/.php
Я собираюсь предположить, что если вы удаляете все конечные слэши, то выбор запроса индекса каталога из запроса имени файла в родительском каталоге станетпочти невозможно.Как определить запрос для каталога 'foobar':
example.com/foobar
из запроса на файл с именем foobar (который на самом деле является foobar.php)
example.com/foobar
Это может бытьвозможно, если вы использовали директиву RewriteBase
.Но если вы сделаете это, то эта проблема станет намного сложнее, поскольку вам потребуется директива RewriteCond
для проверки уровня файловой системы, если запрос сопоставлен с каталогом или файлом.
Тем не менее, если вы удалите свое требование об удалении всех конечных косых черт и вместо принудительного добавления конечных косых черт проблема «без расширения .php» станет более разумной.
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
Это все еще не идеально - каждый запрос файла все еще имеет .php, добавленный к запросу внутренне. Запрос 'hi.txt' поместит это в ваши журналы ошибок:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
Но есть и другой вариант, установите директивы DefaultType
и DirectoryIndex
следующим образом:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
Обновление 2013-11-14 - Исправлен приведенный выше фрагмент для включения наблюдения Никореллия
Теперь запросы на hi.txt (и все остальное) выполняются успешно, запросы к example.com/test возвращают обработанную версию test.php, а файлы index.php снова будут работать.
Я должен отдать должное, если кредит заслуживает этого решения, как я его нашел Блог Майкла Дж. Радвинса , выполнив поиск в Google по запросу php без расширения apache .
Удалить косую черту
Некоторые поиски apache remove trailing slashes
привели меня на некоторые страницы поисковой оптимизации. Очевидно, что некоторые системы управления контентом (в данном случае Drupal) сделают контент доступным с конечной косой чертой в URls и без нее, что в мире SEO приведет к штрафу за дублирование контента. Источник
Решение кажется довольно тривиальным: с помощью mod_rewrite
мы переписываем условие, при котором запрашиваемый ресурс заканчивается на /
, и переписываем URL, отправляя обратно HTTP-заголовок 301 Permanent Redirect
.
Вот его пример, который предполагает, что ваш домен - blamcast.net и позволяет опционально добавлять к запросу префикс www.
.
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Теперь мы куда-то добираемся. Давайте сложим все вместе и посмотрим, как это выглядит.
Обязательный www.
, без .php
и без косых черт
Предполагается, что домен foobar.com работает на стандартном порту 80.
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Флаг 'R' описан в разделе директивы RewriteRule
. Отрывок:
redirect|R [=code]
(принудительное перенаправление) Замена префикса на
http://thishost[:thisport]/
(что делает новый URL URI) для принудительного
внешнее перенаправление. Если код не указан, ответ HTTP 302
( MOVED TEMPORARILY ) будут возвращены.
Заключительная записка
Мне не удалось заставить удаляться косую черту. Перенаправление закончилось тем, что дало мне бесконечные циклы перенаправления. После прочтения оригинального решения ближе у меня создается впечатление, что приведенный выше пример работает для них из-за того, как настроена их установка Drupal. Он конкретно упоминает:
На обычном сайте Drupal, с включенными чистыми URL, эти два адреса
в основном взаимозаменяемы
В отношении URL-адресов, заканчивающихся косой чертой и без нее. Кроме того,
Drupal использует файл с именем .htaccess
, чтобы сообщить вашему веб-серверу, как
обрабатывать URL. Это тот же файл, который включает чистый URL-адрес Drupal
магия. Добавив простую команду перенаправления в начале вашего
.htaccess
файл, вы можете заставить сервер автоматически удалять любые
косые черты.