2017-09-26 27 views
2

斜線我的.htaccess文件中有一個重寫這樣反而看到example.com/login.php的,一看就會example.com/login的.htaccess返回500內部服務器錯誤時,在文件名

這裏是寫在文件:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

它完美,除了一兩件事:我創建了一個名爲api.php文件,該文件將作爲API。 我希望客戶去example.com/api/logoutexample.com/api/auth等,即使api不是一個文件夾,而是一個PHP文件。

問題是,無論何時我去example.com/api/logout(或甚至example.com/login/foo)這樣的文件,我總是會得到500內部服務器錯誤。如果我去example.com/api.php/logout,我得到一個404錯誤。

我檢查了500內部服務器錯誤錯誤文件,並說Request exceeded the limit of 10 internal redirects due to probable configuration error這是有意義的,因爲mod_rewrite的運行,直到所有的條件都滿足。

我應該如何改變我重寫解決這一問題?

回答

0
: 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

當你請求的形式/api/logout的網址,你會得到一個改寫環(500錯誤),因爲REQUEST_FILENAME映射到<document-root>/api(如果你追加.php這確實是一個有效的文件),但你最終在RewriteRule指令(顯然不是一回事)追加.php/api/logout(網址路徑)。 /api/logout.php再被改寫,/api/logout.php.php等等等等反覆追加.php的URL路徑,而所有的時間檢查/api.php是一個有效的文件。

如果您的所有文件都在文檔根目錄,那麼你就可以改變你的RewriteRule模式只匹配第一個路徑段。例如:

RewriteRule ^([^/]+) $1.php [L] 

但是,如果你有不同的目錄深度文件(你引用不.php擴展名),那麼你可能需要創建一些具體的規則/異常。

如果我去example.com/api.php/logout,我得到一個404錯誤。

這將導致404如果附加路徑信息(PATH_INFO)已被禁用(儘管它在默認情況下爲PHP文件通常啓用)。您可以在您的.htaccess文件的頂部明確啓用此功能:

AcceptPathInfo On 
相關問題