2013-10-21 166 views
2

在我的服務器上我有多個域。mod_rewrite不隱藏子目錄

RewriteEngine On 
RewriteBase/

# 1. Redirect multiple domains to http://domain.de/ 
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.de [NC] 
RewriteRule ^/?(.*) http://domain.de/$1 [L,R,NE] 

# 2. Redirect all requests to /subdirectory 
RewriteRule ^$ /subdirectory [L] 

的2.規則工作正常,但它並不隱藏子目錄中的網址,也沒有按預期工作:爲http://domain.de/content/image.png返回404的請求,因爲實際的文件位於http://domain.de/subdirectory/content/image.png

此外,我有一些工具位於子目錄/subdirectory旁邊的工具文件夾。我想確保我仍然可以訪問它們。這目前正在工作。

問題

我怎樣才能確保,對於http://domain.de/content/image.png作品的要求?

我試過

RewriteCond %{REQUEST_URI} !^/subdirectory/ 
RewriteRule (.*) /subdirectory/$1 [L] 

但是,這只是返回錯誤500在Apache的錯誤日誌中的條目:`請求超過了10個內部重定向的上限,由於可能的配置錯誤。

編輯

由拉維Thapliyal提供的指導後,有(我猜)一件事剩餘:刪除URL中的子目錄。

[[email protected] html]$ curl -I domain.de/ 
HTTP/1.1 301 Moved Permanently 
Date: Mon, 21 Oct 2013 12:42:22 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Location: http://domain.de/subdirectory/index.php 
Vary: Accept-Encoding 
Content-Type: text/html 

這是獲取返回什麼,但其實我是想獲得HTML不是一個位置,然後頭當然會被重定向我內外兼修的子目錄,然後將其對用戶可見。可能與某個子目錄中的另一個.htaccess文件有關?

EDIT2

看來問題是關係到subdirectory背後的TYPO3安裝。接受的答案按預期工作。

回答

2

你的第一條應該做一個外部重定向(更改域在內部也不會在所有問題)

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.de [NC] 
RewriteRule ^/?(.*)$ http://domain.de/$1 [R=301,L,NE] 

不需要你的第二個規則。新規則也會覆蓋根目錄/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d [OR] 
RewriteCond %{REQUEST_URI} ^/?$ 
RewriteCond %{REQUEST_URI} !^/subdirectory [NC] 
RewriteRule ^(.*)$ /subdirectory/$1 [L] 

兩個RewriteCond S於%{REQUEST_FILENAME}將確保您可以訪問任何文件-f或目錄-d外部存在/subdirectory


基本上,如果URL路徑指向任何現有目錄,條件 %{REQUEST_FILENAME} !-d將阻止重定向。這可以防止像 /existing-directory這樣的URL重定向到 /subdirectory/existing-directory

但是,這也可能阻止根URL /請求這就是爲什麼你收到目錄索引禁止錯誤。因此,上述條件是[OR]'d與%{REQUEST_URI} ^/?$以允許/也被重定向到/subdirectory

+0

訪問域時將導致403。德。錯誤日誌說:'由Options指令禁止的目錄索引:/ var/www /' –

+0

爲'^/$'添加一個'RewriteCond'。 –

+0

這留下了剩餘的一件事:URL中的可見子目錄。 –