根據這個答案:mod_rewrite 的 url 最大長度為 257 個字元?根據使用 mod_rewrite 的檔案系統,存在最大 255 個字元的硬限制。
根據接受的答案,有兩種解決方案:
- 將應用程式的 URL 格式變更為每個斜線之間最多 255 個字元。
- 將重寫規則移至 apache 虛擬主機配置中並刪除 REQUEST_FILENAME。
我無法使用第一種方法,所以我正在嘗試找出第二種方法。
我已按要求將重寫規則放入 Apache 虛擬主機配置中。但我不知道如何刪除 REQUEST_FILENAME 並且我的 Web 應用程式框架(Dragonfly)仍然可以工作。
以下是我從 .htaccess 移至 Apache 虛擬主機設定檔中的重寫規則部分:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]
# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$
# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]
我嘗試刪除 {REQUEST_FILENAME},但它只是以各種方式破壞了框架。如何在不使用 {REQUEST_FILENAME} 的情況下重寫此內容?
答案1
下面三行告訴 Apache 檢查檔案系統以查看該檔案是否存在。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]
第一個意思是「如果 URI 不是目錄」。第二個意思是「如果 URI 不是連結」。第三個意思是「如果 URI 不是檔案」。
如果刪除或註解掉這些行,Apache 會將下面的重寫套用於不以「.html」或「.nl」結尾的每個文件,並且不會先檢查檔案系統以查看該文件是否存在。
上面三行是有目的的。它們的存在是為了,如果您將實際的文件、目錄或符號鏈接添加到文檔根目錄中,並且有人請求該文件、目錄或符號鏈接,Apache 將正常處理它,而不進行重寫。如果您知道永遠不會將實際文件新增至文件根目錄中,那麼您可以安全地註解掉這些文件,而不會產生任何副作用。
一個可能更好的改變是在三行上方新增一個規則,如下所示:
RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]
這將攔截斜線之間單一字串超過 255 個字元的任何 URI,並將它們直接發送到重寫,而不檢查檔案系統。 [L] 選項可確保 Apache 不再檢查與此規則相符的任何規則。不存在攔截映射到實際檔案的 URI 的危險,因為與此正規表示式相符的 URI 將不是有效的檔案路徑。
更新:
符合任何長度至少為 255 個字元的 URI 的正規表示式。
RewriteRule (.{255}) index.cgi?$1 [L,QSA]
答案2
以下內容對我有用(在具有 apache 2.2.21 的 debian 上的預設虛擬主機中測試)。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.cgi?$1 [L,QSA]