Apache mod_rewrite
То, что вы ищете, это mod_rewrite ,
Описание: Предоставляет основанный на правилах механизм перезаписи для перезаписи запрошенных URL-адресов на лету.
Вообще говоря, 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 не загрузится, потому что нет 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 no extension apache .
Удалить завершающие косые черты
Некоторые поисковые запросы apache remove trailing slashes
привели меня к некоторым страницам поисковой оптимизации. Очевидно, некоторые системы управления контентом (в данном случае Drupal) будут делать контент доступным с косой чертой в конце URls и без нее, что в мире SEO приведет к штрафу за дублирование контента на вашем сайте. Источник
Решение кажется довольно тривиальным: mod_rewrite
мы переписываем при условии, что запрошенный ресурс заканчивается на a, /
и перезаписываем URL, отправляя обратно 301 Permanent Redirect
HTTP-заголовок.
Вот его пример, который предполагает, что ваш домен - 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 ( ВРЕМЕННО ПЕРЕМЕЩЕН ).
Заключительное примечание
Мне не удалось добиться успешного удаления косой черты. В итоге перенаправление дало мне бесконечные циклы перенаправления. После ознакомления с исходным решением у меня сложилось впечатление, что приведенный выше пример работает для них из-за того, как настроена их установка Drupal. Он особо отмечает:
На обычном сайте Drupal с включенными чистыми URL-адресами эти два адреса в основном взаимозаменяемы.
В отношении URL-адресов, заканчивающихся косой чертой и без нее. Более того,
Drupal использует файл, .htaccess
который сообщает вашему веб-серверу, как обрабатывать URL-адреса. Это тот же файл, который задействует магию чистых URL-адресов в Drupal. Добавив простую команду перенаправления в начало
.htaccess
файла, вы можете заставить сервер автоматически удалять любые завершающие косые черты.