2011-08-30 224 views
0

我有一個Zend Framework應用程序,在根目錄中有一個.htaccess文件,將所有流量導向/public目錄,其中index.php所在的目錄。htaccess導致服務器錯誤500

這是.htaccess的內容:

RewriteEngine On 

RewriteRule ^\.htaccess$ - [F] 

RewriteCond %{REQUEST_URI} ="" 
RewriteRule ^.*$ /public/index.php [NC,L] 

RewriteCond %{REQUEST_URI} !^/(upload|img|js|css|less)/.*$ 
RewriteCond %{DOCUMENT_ROOT}/public/upload%{REQUEST_URI} -f 
RewriteRule ^(.+\.(jpg|png|mp3))$ /public/upload%{REQUEST_URI} [NC,L] 

;RewriteCond %{REQUEST_URI} !^/public/.*$ 
;RewriteRule ^(.*)$ /public/$1 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^.*$ - [NC,L] 

RewriteRule ^public/.*$ /public/index.php [NC,L] 

正如你可以看到,有兩個註釋掉線。

該部分,據說是指導流量到/public,並在我的本地服務器和我的共享主機上工作,似乎在我的客戶端的服務器上慘敗。

因此,在兩行註釋掉的時候,當我在瀏覽器中鍵入網站的地址時,我得到一個目錄列表。當我將/public附加到地址時,我按照預期將其帶到/public/index.php,但由於請求沒有正確重定向,所以對JS和CSS文件也沒有。

當我取消註釋行時,出現500內部服務器錯誤(index.php根本沒有達到)。

其他重寫正確工作(至少據我所知)。

任何想法爲什麼會發生這種情況,以及如何糾正?

在此先感謝。

+0

據我所知,「#」是配置(或.htaccess)文件中唯一允許的註釋字符,因此您的兩條「註釋」行實際上不是。 從[Apache Server 2.x文檔](http://httpd.apache.org/docs/2.0/configuring。html): '以散列字符「#」開頭的行被視爲註釋,並被忽略。註釋可能未包含在配置指令後面的行中。# –

+0

感謝您的評論。我實際上已經刪除了「在我的.htaccess中註釋掉了的行,並且只留下了這裏作爲關於刪除內容的參考,儘管我不知道這個分號是無效的註釋字符;) – mingos

回答

1

保存自己很多的悲傷並執行以下操作:

  1. 文檔根目錄設置爲public目錄。
  2. 設置rewrite rules in the VirtualHost entry或在public目錄中的.htaccess文件中使用標準Zend Framework rewrite rules

好吧,給你的共享主機的限制,試試這個...

  1. 將所有public文件到您的文檔根目錄,包括在第2步上面
  2. 將提到.htaccess文件其餘文件夾(即applicationlibrary)位於文件系統的任何位置,最好位於Web文檔根目錄之外。一個例子可能是/home/user/apps/my-app-name/
  3. 修改index.php文件與新APPLICATION_PATH,如

    // Define path to application directory 
    defined('APPLICATION_PATH') 
        || define('APPLICATION_PATH', 'home/user/apps/my-app-name/application'); 
    

現在一切都應該「只是工作」,你的網站將不會與字訪問「公共」在URL中。

+0

我不能。這是一個共享主機,我無法訪問vhosts.conf,我需要依靠mod-rewrite將根目錄中的流量導向/ public。如果這很容易,我會在第一個不用寫自定義的.htaccess – mingos

+0

@mingos我已經爲你的問題添加了另一個解決方案 – Phil

+0

嗯...需要重寫部分代碼(例如,我有一個公共和非公開的'上傳'文件夾) ...但它值得一試... – mingos