2011-07-10 45 views
1

男人..我不知所措。我有一個基本的重寫流程,我似乎無法工作。我想檢查一個實際文件是否存在。如果有,請提供,但如果沒有,請重新路由到PHP文件。這是我的.htaccess文件:htaccess規則沒有在服務器上正確路由(真實文件檢查)

RewriteEngine On 
RewriteCond %{DOCUMENT_ROOT}/application%{REQUEST_URI} !-f 
RewriteRule ^(.*)$ core/index.php?f=%{DOCUMENT_ROOT}/application%{REQUEST_URI} [QSA,L] 

RewriteRule (.*) application/$1 [L] 

我的目錄結構如下:

. 
├── [drwxr-xr-x] application 
│   └── [-rw-r--r--] test.html 
├── [drwxr-xr-x] core 
│   ├── [-rw-r--r--] index.php 
│   └── [drwxr-xr-x] tmp 
│    ├── [-rw-r--r--] httpd-access.log 
│    ├── [-rw-r--r--] httpd-error.log 
│    └── [-rw-r--r--] rewrite.log 
└── [-rw-r--r--] .htaccess 

3 directories, 6 files 

下面是我希望得到任何幫助許可 。 謝謝。

+0

1)請提供URL示例2)請解釋您嘗試實現什麼的邏輯(使用來自#1的URL)3)您現在有什麼結果,您期望得到什麼結果?我問,因爲我認爲你可能在這裏有一個重寫循環。 – LazyOne

+0

1)我現在沒有這個在線提供。 2)即時通訊試圖通過website.com/realfile.txt服務位於應用程序目錄中的真實文件,並將所有其他請求(例如非真實文件)路由到一個php文件。 3)真正的文件被路由到php文件。 – onassar

+0

我不是在詢問真正的在線URL - 我只需要一個示例URL,例如'http:// example.com/meow'(使用您自己的文件/ url) – LazyOne

回答

0

你確定你的Apache有mod重寫打開嗎?

+0

是。將最終規則更改爲像RewriteRule(。*)http://www.google.com?f=$1 [L]的作品。看起來規則正在被正確捕獲,但是子請求正在引發問題? – onassar

0

也許你可以之後RewriteEngine敘述在

+0

RewriteBase%{DOCUMENT_ROOT}似乎不被允許,而RewriteBase /似乎沒有幫助。這是在滿足最後一條規則之後的次級路由,其中​​L標誌似乎是問題所在。 – onassar

0

被放置在的.htaccess在根文件夾中添加RewriteBase/RewriteBase%{DOCUMENT_ROOT}指令。如果你打算在配置文件中(例如<VirtualHost>),那麼它需要稍微修改。

RewriteEngine On 
RewriteBase/

# 1) do not do anything for existing file or folder 
RewriteCond %{ENV:REDIRECT_STATUS} !^$ 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .* - [L] 

# 2) real file (in application folder) -- rewrite path 
RewriteCond %{DOCUMENT_ROOT}/application%{REQUEST_URI} -f 
RewriteRule (.*) /application/$1 [L] 
# 3) nope, no such file -- serve via index.php 
RewriteRule ^(.*)$ /core/index.php?f=%{DOCUMENT_ROOT}/application%{REQUEST_URI} [QSA,L] 

很多人遺忘的重要事情是,在URL被重寫後,它會進入下一次迭代。在這樣的下一次迭代中,URL已經與最初請求的不同。這些規則應該關注這一刻。

這是它將如何爲/test.html工作:

  1. 因爲沒有/test.html
  2. 規則#2會的工作,因爲有一個文件/application/test.html規則#1將被跳過。重寫進入下一次迭代([L]標誌)。
  3. 規則1將作爲URL現在是/application/test.html,並且此類文件確實存在。這條規則告訴Apache停止重寫任何進一步的工作。

這是它將如何爲/meow.html工作:

  1. 因爲沒有/meow.html
  2. 規則#2將被跳過,因爲沒有文件/application/meow.html規則#1將被跳過。
  3. 規則3將起作用 - URL被重寫爲core/index.php?f=%{DOCUMENT_ROOT}/application/meow.html。重寫進入下一次迭代([L]標誌)。
  4. 規則1將作爲URL現在是/core/index.php,並且此類文件確實存在。這條規則告訴Apache停止重寫任何進一步的工作。

編輯: 您可以添加之前重寫規則的目的部分斜線/(應該是沒有什麼區別......但您的安裝可能是從我的有點不同)。

+0

heya。我嘗試了這一點,並且在它工作的時候,它允許/application/test.html被路由。這並不理想,因爲它以一種暴露文件系統/結構的方式。我試圖對前兩個條件和規則進行註釋,但是這會破壞/application/test.html的重新路由。有什麼想法嗎? – onassar

+0

@onassar你的意思是_「它允許/application/test.html被路由」_? **請解釋**。在發佈答案之前,我已經在本地幾次測試了這些規則 - 它在這裏完美工作:所有重定向都是內部的,因此URL在瀏覽器中保持不變。如果您在瀏覽器的地址欄中更改了網址 - 您可能會從之前的嘗試或其他東西中緩存網址 - 請嘗試使用其他瀏覽器或清除緩存並重新啓動。你把所有的規則都放在了一起嗎?或者你把它們與你自己的混合在一起 - 顯示你當前的.htaccess。附: - 你的Apache版本是什麼?我有2.2.17 – LazyOne

+0

我會在晚上回應。 @工作到6左右 – onassar

相關問題