2014-02-06 4 views
1

EDIT: Этот вопрос был в основном решен путем ответа ниже, но он также поднял новый вопрос. Если я удалю «RewriteCond% {REQUEST_FILENAME}! = F» из файла .htaccess, я снова перенаправляется на файл stock.com/index.php?page=index.php, если я сделаю запрос на share.com/register. Я могу просто согласиться с тем, что он должен быть там, но я пытаюсь понять, почему удаление этой строки кода вызывает такое поведение. Я получаю, что он позволяет посетителям получать доступ к фактическим файлам, таким как изображения, но я не понимаю, как это связано с перенаправлением/перенаправлением URL-адреса, такого как stock.com/register. Если бы кто-нибудь мог объяснить, что я был бы очень признателен.Pretty URLs - Dot Causeing Error

Попытка получить красивые URL-адреса для работы на простом сайте MVC Я разрабатываю локально на Wampserver, только для учебных целей. У меня есть следующая настройка кода .htaccess, чтобы любой URL-запрос перенаправлялся обратно в контроллер index.php, который обслуживает различный контент на основе значения $ _GET 'страницы'.

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !=D 
RewriteCond %{REQUEST_FILENAME} !=F 
RewriteRule ^([-\w.]+)$ index.php\?page=$1 [R=302,L] 

У меня он установлен как R = 302, так что я могу видеть, где он перенаправляет меня. Имя хоста, на котором я настроил его, - это share.com. Если я пойду на сайт, это прекрасно работает. Но если я попытаюсь посетить сайт stock.com/register, я перенаправлен на сайт stock.com/index.php?page=index.php. Если я вырву точку из регулярного выражения, все будет хорошо, но тогда я не могу иметь имена страниц/файлов с точками в них. Не нужно, но я делаю это для обучения, поэтому я хотел бы знать, что это за решение. Я пробовал оба, избегая точки, а не. Благодаря!

+0

'.' (точка) означает любой символ, кроме символов новой строки. Вероятно, вы имеете в виду буквальный '\ .'. – Xeoncross

+0

Спасибо за ответ. Я пробовал это в обоих направлениях и получал тот же результат. Из того, что я читал, точка не является метасимволом внутри символьного класса, и поэтому не требуется экранирование. Это неправильно? – Joe

+0

Нет, это правильно. Виноват. :) – Xeoncross

ответ

1

Некоторые проблемы с синтаксисом. Попробуйте этот код:

RewriteEngine on 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([-\w.]+)$ index.php?page=$1 [R=302,L,QSA] 
+0

Спасибо, это отлично работает. Если вы не возражаете и только для учебных целей, не могли бы вы объяснить, почему 2 RewriteCond's выше предотвращают первоначально описанное поведение (перенаправление на share.com/index.php?page=index.php) У меня просто возникают проблемы с мой взгляд на то, как они связаны. Еще раз спасибо! – Joe

+0

Да, конечно, я могу объяснить. Две строки 'RewriteCond' пропускают это правило перезаписи, если запрос есть, или для допустимого файла ('! -f') или каталога ('! -d'). Rewrite engine запускает эти правила до тех пор, пока существует соответствующее правило. Таким образом, без этих 2 условий, когда правило перезаписи выполняется снова, оно переписывается на 'index.php? Page = index.php'. Вы можете видеть, что у вас есть некоторые правила, но он не работает из-за неправильного синтаксиса. Но я не понял, почему вы удалили метку приемки из рабочего ответа. – anubhava

+0

Я думаю, я все еще не понимаю. Если я набираю share.com/lecture,^([- \ w.] +) $ Должен сопоставлять и фиксировать часть «лекции» URL-адреса, а затем переписывать/перенаправлять на share.com/index.php?page= лекция. Я не понимаю, почему index.php получает выбранный/захваченный, когда он не является частью исходного URL. По крайней мере, так оно и должно быть для меня. Почему правило rewrite работает снова без этих 2 условных правил? И я снова буду принимать ваш ответ как правильный, я просто хотел оставить его открытым, чтобы получить больше отзывов от других. Спасибо за вашу помощь! – Joe