Хорошо, вот моя попытка. Обратите внимание, что руководство Apache довольно хорошо. Я отличаюсь от benlumley в разделе "сайт". Кроме того, вы можете заменить ([0-9]+)
на (.+)
, если названия новостных статей не все числовые.
# Ensure that rewriting is enabled
RewriteEngine on
# First strip the www as benlumley did
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
# Then convert /site to /site/, reflecting the change in the address bar
RewriteRule ^([^/.]+)$ /$1/ [R=301,L]
# Finally map /site/ to /site.php
RewriteRule ^([^/.]+)/$ /$1.php
# Finally, fix download and news as benlumley did
RewriteRule ^download/(.+)$ /download.php?file=$1
RewriteRule ^news/article/([0-9]+)$ /news.php?article=$1
РЕДАКТИРОВАТЬ : исправлена ошибка копирования / вставки для части "strip www".
ПРИМЕЧАНИЕ : Любые имеющиеся у вас теги <link href="...">
или <script src="...">
теперь необходимо указывать как абсолютные пути, поскольку вы фактически изменили каталог, из которого, как представляется, страница обслуживается.
например. рассмотрите следующую строку из вашего blog.php:
<link rel="stylesheet" type="text/css" href="style.css">
Ранее браузер видел http://site/blog.php и пытался получить http://site/style.css,, который работал.
Теперь, когда браузер вместо этого видит http://site/blog/, относительный URL выше интерпретируется как http://site/blog/style.css,, который не существует. Таким образом, href необходимо изменить следующим образом:
<link rel="stylesheet" type="text/css" href="/style.css">