Apache If 語句不起作用
我的舊網站有大約 25000 個網址,網址中有 abc。
我想在我的 apache conf 中使用 3 個 DBM 文件。
目標是如果 URL 不包含 abc 即。
http://example.com/1234.htm
那麼我不想查看 abcredirects.DBM 文件。如果 URL 確實包含 abc 即。
http://example.com/abc1234.htm
那麼我只想查看 abcredirectsDBM 文件。我正在嘗試在我的 Apache 中使用 if 語句,但是無論何時我使用該
<If>
塊,我放入的任何內容似乎都被忽略了。我已經改變了
<If "%{REQUEST_URI} =~ m#^abc#">
很多不同的方式,但這沒關係。如果我刪除<if>
塊所有重定向按預期工作。為什麼我的
<if>
塊被忽略?沒有錯誤,根據日誌http://example.com/abc1234.htm
(我假設)沒有評估為真,所以我不確定還有什麼要檢查的。[root@mail conf]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Jun 27 2018 13:48:59 <IfModule mod_rewrite.c> RewriteEngine On RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm" <If "%{REQUEST_URI} =~ m#^abc#"> RewriteCond ${abcredirects:$1} !="" RewriteRule ^(.*) /${abcredirects:$1} [R=301,L] </If> RewriteMap shortalias "dbm:/etc/httpd/conf/shortalias.dbm" RewriteCond ${shortalias:$1} !="" RewriteRule ^(.*) /${shortalias:$1} [R=301,L] </IfModule> <VirtualHost *:80> DocumentRoot /var/www/sites/me ServerName example.com DirectoryIndex index.htm Options +FollowSymLinks RewriteEngine On RewriteOptions Inherit RewriteMap otherredirects "dbm:/etc/httpd/conf/otherredirects.dbm" RewriteCond ${otherredirects:$1} !="" RewriteRule ^(.*) /${otherredirects:$1} [R=301,L] </VirtualHost>
我見過並嘗試過的伺服器故障問題:
如果 url 具有特定模式重定向到 https,則 apache 強制
在 Apache 中重定向、更改 URL 或將 HTTP 重定向到 HTTPS - 關於 Mod_Rewrite 規則你想知道但不敢問的一切
<If "%{REQUEST_URI} =~ m#^abc#">
REQUEST_URI
伺服器變數始終以斜杠(URL 路徑的開頭)開頭,因此正則表達式永遠m#^abc#
不會在這裡匹配。您需要改用正則表達式m#^/abc#
。(假設這不是您已經嘗試過的“不同方式”之一?)我還會避免在 vHost 和伺服器之間拆分您的配置 - 除非有特定要求?這使 mod_rewrite 的問題變得複雜,因為虛擬主機上下文中的指令通常會覆蓋伺服器上下文中的指令,因此您需要使用 mod_rewrite 繼承(您正在這樣做) - 但這會變得不必要的混亂。(該
inherit
選項繼承了目前上下文**後面的父指令,這可能不是您所期望的。)您的其餘問題似乎與您最近的問題交叉: