2016-05-21 2 views
0

У меня есть следующий код в моем .htaccess:RewriteRule для 404 не работает

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php !-f 
RewriteRule ^admin/.+ /admin/admin_panel.php [R=404,L,NC] 

Первая часть должна переписать запросы в виде http://example.com/url в http://example.com/url.php и он работает правильно. Вторая часть должна перенаправлять запросы на несуществующие файлы в /admin/ до /admin/admin_panel.php, но на этот раз это не сработает. Я делаю это неправильно?

ответ

2

изменения второй части следующим кодом:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} ^/admin/ 
RewriteRule ^admin/(.*)$ admin/admin_panel.php [L,NC] 

В своем коде, этот флаг [R=404,L,NC] перекроет предыдущее правило и перенаправить любой неверный запрос на страницу ошибки 404.

Код выше будет перенаправлять любые неправильные запросы в каталог администратора не для всех

0

Согласно this document:

Любой действительный ответ HTTP-код состояния может быть указано, с использованием синтаксиса [R = 305], с кодом состояния 302 используется по умолчанию, если он не задан. Указанный код состояния необязательно должен быть кодом статуса перенаправления (3xx). Однако, если код состояния находится за пределами диапазона перенаправления (300-399), строка замещения полностью отбрасывается, и переписывание останавливается, как если бы использовался L.

[R=404] сбрасывает строку перенаправления, и правило не работает так, как хотелось бы, чтобы он работал. Решением является либо использование [R=3xx], чтобы сделать перенаправление, либо использовать [R=404] без перенаправления. Другой способ - использовать синтаксис ErrorDocument 404 somefile.php. В этом примере решение было бы создать два различных файла:

/.htaccess:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 

И /admin/.htaccess:

ErrorDocument 404 /admin/admin_panel.php 

Кроме того, в этом решение правило из корневого каталога .htaccess файл работает по назначению.

EDIT:

Пожалуйста, обратите внимание, что Mohammed Elhag's answer ниже также может работать здесь

Смежные вопросы