如何更改 mod_rewrite 以避免 {REQUEST_FILENAME} 以獲得 255 個字元左右的 URL 限制?

如何更改 mod_rewrite 以避免 {REQUEST_FILENAME} 以獲得 255 個字元左右的 URL 限制?

根據這個答案:mod_rewrite 的 url 最大長度為 257 個字元?根據使用 mod_rewrite 的檔案系統,存在最大 255 個字元的硬限制。

根據接受的答案,有兩種解決方案:

  1. 將應用程式的 URL 格式變更為每個斜線之間最多 255 個字元。
  2. 將重寫規則移至 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]

相關內容