2013-01-21 105 views
2

我期待在我的.htaccess文件來設置規則,以便以.php擴展名的文件都可以通過只用一個斜線替換擴展訪問(/foo/bar/將靜默加載/foo/bar.php)。以前,我發現this,這是我正在尋找的一種,除了它只改變/foo/bar.php/foo/bar(注意沒有結束斜線)。的.htaccess重寫/富/酒吧/到/foo/bar.php

對於htaccess,我幾乎是一個完全新手,用上面鏈接的代碼調整大約30分鐘後,沒有產生大量的500 internal server error s。我相信這是一個很簡單的解決方案,但Google和試驗和錯誤都沒有給我帶來任何結果。

任何人都可以看看上述文章中的代碼(複製如下)並將其更改爲/foo/bar/將重寫爲/foo/bar.php

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

## hide .php extension 
# To externally redirect /dir/foo.php to /dir/foo 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] 
RewriteRule^%1 [R,L,NC] 

## To internally redirect /dir/foo to /dir/foo.php 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule^%{REQUEST_URI}.php [L] 

非常感謝!

回答

2

每下面的意見,目的是讓用戶可見的網址一樣/富/酒吧/實際運行PHP腳本像/foo/bar.php。另外,您可能希望嘗試直接加載/foo/bar.php的用戶重定向到/ foo/bar /以保持一致性。

#Redirect users loading /foo/bar.php to /foo/bar/ 
RewriteRule ^(.*)\.php$ $1/ [R] 

#Rewrite /foo/bar/ (what the user sees) silently to /foo/bar.php 
RewriteRule ^(.*)/$ $1.php [L] 

[R]在第一規則的端部指定而不是重定向重寫,從而使用戶負載/富/酒吧/。第二條規則末尾的$1與括號(終止斜槓前的所有內容)匹配,然後在最後加上.php。 [L]意味着停止評估RewriteRules

正如我在原來的答覆中,對於使用字符串替換領先斜線的依賴於​​上下文。有了這些規則,您將能夠看到第一條規則的效果,因爲它是重定向。如果重定向嘗試去mydomain.comfoo/bar/而不是mydomain.com/foo/bar/,則在每個規則中的$1之前添加一個前導斜槓。

另一個說明 - 你的PHP腳本期望任何查詢字符串?如果有的話,可能需要進行額外的調整。

Apache mod_rewrite reference有更多的細節。

+0

這只是'404 Not Found'錯誤到處都是。 – Charles

+0

對不起,''RewriteRule ^(。*)\。php $/$ 1 /'產生相同的結果。仍然只在每個頁面上顯示404 Not Found。 – Charles

+1

你太快了......當我編輯第二個選項時,你測試了它。 :-)但是,爲了確保你明白,你要求的是將'/ foo/bar.php'重寫爲'/ foo/bar /'。這並不意味着你只是隱藏了用戶的「.php」部分,這意味着Apache實際上會嘗試加載'/ foo/bar /'。如果你真的想運行bar.php腳本,但用戶只看到bar /,那是另一個問題。 –

1

最後,我用下面的代碼,我原來的裁斷和大衛Ravetti的幫助的組合得到了這個工作。

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/
## hide .php extension 
# To externally redirect /dir/foo.php to /dir/foo 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] 
RewriteRule^%1/ [R,L,NC] 
## To internally redirect /dir/foo to /dir/foo.php 
RewriteRule ^(.*)/$ $1.php [L]