2012-02-22 2 views
0

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

Я пробовал:

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 

из "Spoofing" a 404 not found error with .htaccess

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

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

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

Благодарим за помощь.

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

ответ

2
RewriteEngine On 

RewriteBase/

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

Тот же результат. Если я перейду на mysite.com/index.php, он загрузится, но если я перейду в mysite.com/index, тогда он скажет мне: «Запрошенный URL/индекс не найден на этом сервере». – Jakar

+2

Не уверен, что все, что я сделал. Я уже несколько часов возился с моим .htaccess. Но я закончил добавление 'Options -MultiViews' над' RewriteEngine On'. Я также добавил 'RewriteBase /'. Это решает мою проблему. Спасибо. – Jakar

1

Я придумал рудиментарное решение, используя страницу ошибки 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.

4

Я думаю,

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

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

RewriteBase/

только для каталога или Адрес, а не для всей VirtualHost!

+0

Спасибо. На самом деле я пошла по другому пути. У меня есть .htaccess визуально удалить расширение, а затем добавить конечную косую черту для всех файлов HTML и PHP. Затем я их внутренне перенаправляю на 'page_load.php', а я' include() 'шаблон и запрошенный URL. – Jakar

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