Опять же mod_rewrite и .htaccess
У меня есть два очень важных(по крайней мере я так думаю) вопроса к вам :)
1. Несколько дней назад я уже задавал подобный вопрос на вашем форуме и получил хороший и понятный ответ от камрада Carpus'a, но, к сожалению, не все работает так, как хотелось бы. :)
Итак, мне необходимо с помощью mod_rewrite переделать ссылку /viewpost.php?id=31 в /post/31
то есть чтобы, когда пользователь заходит по ссылке /post/31 выполнялся скрипт /viewpost.php?id=31 . Достаточно распространенная проблема.
Я поступил так(по совету Carpus'a):
Вписал в .htaccess следующее:
Options -Indexes
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /post/(.*)$
RewriteRule ^(.*)[\/post\/](.*)$ viewpost.php?id=$2 [L]
Возникли проблемы.
1. Если в строке написать http://localhost/lubajaerunda/post/31 ,
то выполнится все тот же скрипт
http://localhost/post/31 .
2. Если в строке написать http://localhost/post (без слеша на конце), то сервер выдаст, что такой страницы не существует.
3. Если я пишу вместо
RewriteCond %{REQUEST_URI} /post/(.*)$
RewriteRule ^(.*)[\/post\/](.*)$ viewpost.php?id=$2 [L]
к примеру
RewriteCond %{REQUEST_URI} /view-all/(.*)$
RewriteRule ^(.*)[\/view-all\/](.*)$ index.php?id=$2 [L] ,
то сервер выдает Internal Server Error
Как решить все эти проблемы?
И еще хотелось бы каким-либо образом реализовать, чтобы если в строке написано /post/send , то выполнялся не /viewpost.php?id=send , а /sendpost.php
2. .htaccess
Как сделать так, чтобы пользователь мог зайти по ссылке вида /post/31 , но не мог зайти по равноценной ссылке /viewpost.php?id=31 ?
Буду очень благодарен за вашу помощь. :)
Повторюсь, что с mod_rewrite'ом я не работал, но мне кажется что ваши вопросы по большей части касаются регулярных выражения.
Думаю что 1ый вопрос возможно разрешится чем-то вроде:
RewriteCond %{REQUEST_URI} ^http://localhost/post/(.*)$
RewriteRule ^http://localhost[\/post\/](.*)$ viewpost.php?id=$1 [L]
Во 2ом вопросе можно предположить следующее написание:
RewriteCond %{REQUEST_URI} ^http://localhost/post/?(.*)$
Internal Server Error может возникать из-за некорректного синтаксиса в .htaccess, причем не обязательно касающегося mod_rewrite'а.
А зачем запрещать вход по старым ссылкам я не понимаю, пусть ходят - жалко что-ли :) Тем более если форум индексирован поисковиками. Из самого простого могу предложить перекидывать со старых ссылок на новые - Redirect viewpost.php /post. Хотя тут я возможно ошибаюсь.
Надеюсь чем-то помог.
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^post/send([/]*)$ sendpost.php [PT,L]
RewriteRule ^post/([a-zA-Z0-9_-]+)([/]*)$ viewpost.php?id=$1 [PT,L]
работает 100%
решает все то что ты написал кроме "Как сделать так, чтобы пользователь мог зайти по ссылке вида /post/31 , но не мог зайти по равноценной ссылке /viewpost.php?id=31 ?"... это попробуй средствами PHP решить
PS: mod_rewrite работает достаточно быстро потому как отрабатывает первым.
Спасибо большое!!! :)