一千萬個為什麽

搜索

使用編碼參數請求URI時找不到404

我很確定這是Apache配置的一些問題,因為它曾經使用相同的PHP/MySQL配置在以前的托管提供商上工作。在我的應用程序中,用戶可以通過轉到這樣的URI來刪除照片:

http://example.com/my-account/remove-media/id/9/ret/my-account%252Fedit-album%252Fid%252F1

參數ret是要刪除的照片的id,參數ret是一個相對URL,用戶在刪除照片後應重定向,但在點擊類似鏈接後,我會得到404 Not Found錯誤的文字:

Not Found

The requested URL /public/my-account/remove-media/id/9/ret/my-account/edit-album/id/1 was not found on this server.

雖然它曾經在我以前的托管服務提供商上工作,所以我想這只是一些簡單的Apache配置問題?

還有一件事,有一個htaccess文件可以將文檔根目錄更改為/ public:

RewriteEngine On

RewriteRule ^\.htaccess$ - [F]

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

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

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

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

在公共文件夾中有第二個用於MVC的htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

最佳答案

這可能是由於 AllowEncodedSlashes 指令設置為關閉。壞消息是,它是在服務器級別配置的,所以.htaccess不會這樣做。如果你不能改變它,那麽我認為修改應用程序代碼來處理非編碼字符串將是最佳選擇。

.../ret/my-account%252Fedit-album%252Fid%252F1 -> .../ret/my-account/edit-album/id/1

如果/ ret/part始終是最後一個,它應該不是那麽大的問題(ret之後都是你的目的地)。

轉載註明原文: 使用編碼參數請求URI時找不到404