如果找不到页面,htaccess RewriteRule会失败

时间:2012-02-22 03:21:29

标签: .htaccess mod-rewrite apache

我正在尝试在我的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

来自"Spoofing" a 404 not found error with .htaccess

我在.htaccess中没有其他RewriteRule尝试此操作,但它仍然只是通过ErrorDocument解析为404错误页面。如果找不到请求的页面,我尝试使用的所有其他规则也会被完全跳过。如果请求的URL解析为现有页面或目录,我指定的任何规则都有效。

我有一个Godaddy共享托管Linux服务器。我很确定我无法编辑我的httpd.conf文件。

我想知道是否有人能告诉我为什么在原始请求不是文件或目录时忽略我的RewriteRule - 当它不存在时。

感谢您的帮助。

修改
我现在看到,如果我去mysite.com/index.php RewriteRule工作。如果我去mysite.com/index RewriteRule不起作用。如果我去一个根本不存在的页面 - mysite.com/asdfasdfsadf那么我的RewriteRule就可以了。所以它只能在现有网址的无扩展版本上失败。

3 个答案:

答案 0 :(得分:4)

我想,

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

应该有帮助。

RewriteBase /

仅适用于目录位置,不适用于整个 VirtualHost

答案 1 :(得分: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] 

答案 2 :(得分: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文件中工作。