htaccess RewriteRule завершается ошибкой, если страница не найдена - PullRequest
0 голосов
/ 22 февраля 2012

Я пытаюсь использовать RewriteRule в моем файле .htaccess, чтобы перенаправить example.com/page на example.com/page.php (или добавить .php к любому запрошенному файлу, который не имеет расширения .

Я пытался:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/.]+)$ $1.php [R]    #I also tried ^(.+)$ with no effect

из «Спуфинг» ошибка 404 не найдена с .htaccess

Я пробовал это без других RewriteRule в моем .htaccess, но он все равно просто разрешает страницу ошибки 404 через ErrorDocument. Все остальные правила, которые я пытаюсь использовать, также полностью пропускаются, если запрашиваемая страница не найдена. Любое указанное мной правило работает, если запрошенный URL-адрес преобразуется в существующую страницу или каталог.

У меня есть хостинг-сервер Godaddy для Linux. Я почти уверен, что не могу отредактировать свой файл httpd.conf.

Мне интересно, может ли кто-нибудь сказать мне, почему мои RewriteRule игнорируются, когда исходный запрос не является файлом или каталогом - когда он не существует.

Спасибо за любую помощь.

EDIT
Теперь я вижу, что если я захожу на mysite.com/index.php, RewriteRule работает. Если я захожу на mysite.com/index RewriteRule не работает. Если я перехожу на страницу, которая вообще не существует - mysite.com/asdfasdfsadf, тогда мой RewriteRule работает. Таким образом, он завершается ошибкой только в версии без расширения существующего URL.

Ответы [ 3 ]

4 голосов
/ 19 октября 2012

Я думаю,

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d

должно помочь.

RewriteBase /

только для Каталог или Местоположение , а не для всего VirtualHost !

2 голосов
/ 22 февраля 2012
RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [R] 
1 голос
/ 23 февраля 2012

Я нашел простейшее решение, используя свою страницу ошибки 404.В моем htaccess я добавляю:

ErrorDocument 404 /error/404.php

И затем в 404.php у меня есть следующий код:

$request = $_SERVER['REQUEST_URI'];
$ext_pos = strpos($request, ".");
if (!$ext_pos){
    $request = $request.".php";
    header("Location: ".$protocol.$domain.$request);
}

Это функционально, но не работает точно так, как я хочу, к несчастью.Я хочу, чтобы вся перезапись работала в файле .htaccess.

...