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
Посібник з перезапису містить інструкції до цього в прикладі Canonical Hostname .
Видаліть задні косої частини (частина 1)
Я хотів би видалити всі косої косої риски зі сторінок
Я не впевнений, чому ви хотіли б це зробити, оскільки керівництво по переписуванню містить приклад з точністю до навпаки . Документи припускають, що видалення останньої косої риски має великий потенціал для виникнення проблем:
Проблема останньої косої риски
Опис:
Кожен веб-майстер може заспівати пісню про проблему останньої косої риски в URL-адресах, що посилаються на каталоги. Якщо вони відсутні, сервер скидає помилку, тому що якщо ви скажете /~quux/foo
замість /~quux/foo/
цього, сервер шукає файл з ім'ям foo. А тому, що цей файл - це каталог, він скаржиться. Насправді він намагається виправити це сам у більшості випадків, але іноді цей механізм потрібно наслідувати вам. Наприклад, після того, як ви зробили багато складних перезаписів URL-адрес у сценарії CGI тощо.
Можливо, ви могли б розширити питання про те, чому ви хочете весь час видаляти кінцеву косу рису?
Видалити .php
розширення
Мені це потрібно, щоб видалити .php
Найближче до цього, про що я можу подумати, - це внутрішнє перезапис кожного запитного документа з розширенням .php, тобто замість example.com/somepage обробляється як запит для example.com/somepage.php. Зауважте, що для цього способу потрібно, щоб кожна деяка сторінка існувала як деяка сторінка.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 без розширення 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
файлу, ви можете змусити сервер автоматично видаляти будь-які прострочені косої риски.