Apache-2.2

為什麼 RewriteBase 不工作?

  • January 15, 2012

這是我正在嘗試做的事情:

  • 域名是thinkingmonkey.me
  • 域有 127.0.0.1 作為 IP 地址
  • mod_alias已安裝。

我有一個名為directories.conf. 我在其中擁有與目錄有關的所有配置。directories.conf包含在httpd.conf

我的directories.conf

Alias /runs /xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
   Order allow,deny
   Allow from all
   AllowOverride All
</Directory>

/mysite/xhprof/xhprof_html/.htaccess. 我有以下內容:

RewriteEngine on
RewriteBase /runs
RewriteRule  .*  index.php

我要做的就是將任何請求定向/mysite/xhprof/xhprof_html/index.php.

當我要求thinkingmonkey.me/runs 沒有尾部斜杠時,我得到404 not found.

所以,我推斷這RewriteBase是行不通的。

我究竟做錯了什麼?

這裡有幾件事在起作用。首先,該Alias指令希望其右側是伺服器上的絕對物理路徑:您想要

Alias /runs /mysite/xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
   Order allow,deny
   Allow from all
   AllowOverride All
</Directory>

其次,RewriteRuleRewriteRule .* index.php不僅匹配http://.../runs,還匹配任何以 開頭的 URL http://.../runs/,甚至,例如http://.../runs/css/...。有幾種方法可以解決這個問題。

 

選項 1:您可以讓 RewriteRule 僅將執行的根重定向到 index.php:

   RewriteRule ^$ index.php
   RewriteRule ^/$ index.php

 

選項2:您可以讓您的 mod_rewrite 配置作為文件存在的特殊情況,並將其他所有內容重定向到index.php

   # Require the path the request translates to is an existing file
   RewriteCond %{REQUEST_FILENAME} -f
   # Don't rewrite it, but do stop mod_rewrite processing
   RewriteRule .* - [L]

   # Now, redirect anything into index.php
   RewriteRule .* index.php

 

選項 3:您可以對某些 URL 進行特殊處理,並將其他所有內容重定向到index.php

   RewriteCond $1 !^css/
   RewriteCond $1 !^js/
   RewriteRule .* index.php

 

選項 4:如果您希望將任何 URL 映射到目錄以顯示index.php文件(如index.html),那麼有一種非常簡單的方法,這可能就是您想要的。您可以將以下內容放在 a.htaccess<Directory>in 塊內directories.conf

   DirectoryIndex index.php index.html

 

腳註:上面的 RewriteRules 基本上丟棄了任何最終映射到index.php. 這包括查詢字元串,因此/runs/?foo=bar/runs/. 如果這不是你想要的,你需要一個規則

   RewriteRule ^(.*)$ index.php/$1 [QSA]

它保留了路徑資訊($1部分)和查詢字元串(“QSA”=“查詢字元串追加”。)

我是不是寫的太多了?:)

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