Centos

Apache If 語句不起作用

  • November 21, 2018

我的舊網站有大約 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選項繼承了目前上下文**後面的父指令,這可能不是您所期望的。)

您的其餘問題似乎與您最近的問題交叉:

引用自:https://serverfault.com/questions/940953