Apache мод переписывает выдачу ошибки 404 - PullRequest
1 голос
/ 13 февраля 2009

Я пытаюсь настроить простое правило перезаписи для преобразования URL, например:

 index.php?page=login

что-то вроде

 page/login

Однако я получаю 404 ошибки.

Кто-нибудь может подсказать, почему не работает следующее?

.htaccess:

RewriteEngine on

RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L]

rewriteEngine off

Я довольно новичок в этом, и любой совет будет принят с благодарностью. Спасибо.

Ответы [ 4 ]

2 голосов
/ 13 февраля 2009

Я думаю, что у вас это может быть не так. Вы хотите, чтобы пользователь набрал это?

http://site.com/page/login

Это более логичная ситуация. Если так, сделайте это:

RewriteEngine On
RewriteBase /
RewriteRule ^/page/login$ /index.php?page=login [L]

Или, в более общем плане:

RewriteRule ^/page/(\w+)$ /index.php?page=$1 [L]
1 голос
/ 13 февраля 2009

Убедитесь, что вы используете RewriteBase.

Это правила, которые я обычно использую. Говорят, что любой запрос, который не является файлом или каталогом, обрабатывается index.php В сценарии запрошенный URI доступен через $_SERVER['REQUEST_URI'].

RewriteEngine On
RewriteBase /some_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /some_dir/index.php [L]
0 голосов
/ 13 февраля 2009

VolkerK делает хорошее замечание: не используйте и RewriteEngine on, и RewriteEngine off, потому что вы не включаете механизм перезаписи, добавляете правило и снова его выключаете. Конфигурация Apache не работает как программирование, где у вас есть набор инструкций, которые компьютер выполняет по порядку. Вы можете представить себе это примерно так: когда Apache анализирует свои файлы конфигурации (например, .htaccess), он сначала считывает все директивы и сортирует их в естественном порядке, в котором они будут применяться. Это больше похоже на инициализацию значений переменных в начале программы, где результат, как правило, одинаков, независимо от того, в каком порядке вы пишете операторы.

В вашем случае указание RewriteEngine on и RewriteEngine off в одном и том же файле может привести к путанице в Apache, поскольку (в моей маленькой метафоре), когда Apache сортирует директивы в их «естественном» порядке, это приводит к с чем-то вроде

RewriteEngine on
RewriteEngine off
RewriteRule ...

, который предположительно выключил бы движок перезаписи. Но, конечно, то, что на самом деле происходит, сложнее, чем просто сортировка директив в списке, поэтому вы не можете точно сказать, что Apache будет делать с таким файлом, как ваш. Только не пытайтесь включать и выключать механизм перезаписи для разных частей файла, и помните, что директивы конфигурации Apache - это не просто операторы, которые нужно запускать по порядку.

0 голосов
/ 13 февраля 2009
RewriteEngine on

RewriteRule ^page/([^/.]+)/?$ index.php?page=$1 [L]

rewriteEngine off

Почему вы выключаете RewriteEnginge?

...