2012-02-22 23 views
0

我試圖在我的.htaccess文件中用戶RewriteRule將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解析爲現有頁面或目錄,則我指定的任何規則都有效。

我有一個Godaddy共享主機Linux服務器。我非常確定我無法編輯我的httpd.conf文件。

我想知道是否有人可以告訴我爲什麼我的RewriteRule被忽略當原始請求不是文件或目錄 - 當它不存在。

謝謝你的幫助。

編輯
我現在看到的,如果我去mysite.com/index.php重寫規則的作品。如果我去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 2012-02-22 16:33:04

+2

不是100%確定我做了什麼。我幾個小時一直在搞亂.htaccess。但是我最後在'RewriteEngine On'上面添加了'Options -MultiViews'。我還加了'RewriteBase /'。這解決了我的問題。謝謝。 – Jakar 2012-02-22 21:08:34

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/

僅供目錄位置,而不是整個虛擬主機

+0

謝謝。我實際上最終走了一條不同的路線。我有我的.htaccess以可視方式刪除擴展名,然後爲所有HTML和PHP文件添加尾部斜槓。然後,我們將它們內部重定向到'page_load.php',並且包含()一個模板和請求的URL。 – Jakar 2012-10-20 04:56:56

相關問題