2009-11-19 33 views
0

過了一兩天,我仍然與Mod Rewrite戰鬥。看來我的開發時間的60%是花在與服務器作鬥爭上的。國防部重寫忽略-d

我目前的網址結構是這樣的,所有http://example.com/xyzhttp://example.com/xyz/abc應該由index.php處理。問題是我有一個http://example.com/admin/部分,這是一個真實目錄這我需要通過HTTP請求訪問的(它的CMS目錄)

當我嘗試瀏覽到CMS http://example.com/admin/,它改變了我的網址http://example.com/admin/?n=admin並返回404.我的index.php正在接收n = admin,因爲它是參數。

我不能明白的是爲什麼被忽略了這兩個條件:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !^admin(?:\/)?$ 

爲什麼我收到重定向到http://example.com/admin/?n=admin(而不是僅僅在http://example.com/admin/停止

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !^admin(?:\/)?$ 

# allow access to certain subdirectories. 
RewriteRule ^admin(?:\/)?$ /admin/ [L,NC] 

# redirect all old URLs to new pages (or 404 sitemap page if no analog?). 
RewriteRule ^company/about(?:\/)?$ /company [R=301,L,NC] 

# catch any others and try to serve them right 
RewriteRule ^/?(.+).html$ /$1 [R=301,L] 

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L] 

燦任何人提供任何想法或指出.htaccess中的任何缺陷?

+0

總結我的問題,我不能訪問服務器上存在的目錄,因爲mod重寫正在重定向我。這不應該發生,因爲我設置RewriteCond%{REQUEST_FILENAME}!-d –

+0

問題嘗試,更改倒數第二個或最後一個規則從... php?n = ...到... phph?m = ...看看哪些規則是有效的應用。 你是說它重定向到admin /?n = admin,但你引用index.php獲取n = admin參數 –

回答

0

每個RewriteCond只應用下一個RewriteRule。

所以只有你的第一條規則有一個條件。

您的選項是重複的規則,或讓那麼最終的退出(不記得這一關我的頭標記)

+0

這將暗示這會工作: RewriteCond%{REQUEST_FILENAME} -f RewriteCond%{REQUEST_FILENAME} -d RewriteCond%{REQUEST_FILENAME}^admin(?:\ /)?$ RewriteRule ^(。?)$ $ 1 [L] 但它不? –

+0

事實上,這應該工作,但不會: 的RewriteCond%{} REQUEST_FILENAME -f [OR] 的RewriteCond%{} REQUEST_FILENAME -d [OR] 的RewriteCond%{} REQUEST_FILENAME管理^(?:\ /)?$ RewriteRule ^(。?)$ $ 1 [L] –

+0

我仍然非常確定你的第一條規則永遠不會匹配,因爲你用「如果路徑不是文件,路徑不是目錄和路徑不是admin/or admin「,那麼如果路徑是」admin/or admin「,則將其重寫爲」/ admin /「 因此,由於前面沒有更改,因此沒有更改。 –

0

你的其他規則之前嘗試此規則:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [L] 

這將結束如果請求的路徑可以映射到現有目錄,則重寫過程。使用-f代替時也是如此。