2012-08-06 66 views
1

我正在使用mod_rewrite向PHP發送查詢以便在CMS中進行處理。我的問題:如果查詢是一個目錄的名稱,發送到PHP的查詢被添加到URL。.htaccess發出HTTP重定向如果查詢匹配目錄

下面是代碼:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) /process.php\?query=$1 [QSA,NC,L] 

因此,如果

http://example.com/lolcats 

mod_rewrite的用戶類型默默重定向到

http://example.com/process.php?query=lolcats 

這是偉大的。但是,如果lolcats是一個目錄,mod_rewrite的重定向(NOT默默)到

http://example.com/lolcats/?query=lolcats 

將查詢到的原始請求的結束。 Apache仍然提供PHP輸出,但它會更改用戶地址欄中的URL。

所以我需要停止查詢被添加到請求,即使查詢是一個目錄的名稱。

回答

1

這是一個DirectorySlash問題,其中apache在嘗試訪問目錄時使用尾部斜槓重定向。

您可以把DirectorySlash Off(注意,有a security warning concerning turning this off),或嘗試有mod_rewrite的喜歡的東西處理它先發制人:

# Above your existing rules 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)$ /$1/ [R=301,L] 

# and small modification to your existing rule to handle trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L] 

但如果你是通過process.php路由所有現有的目錄,安全警告可能可以忽略。

+0

謝謝!我最終使用了第二個選項,因爲我想在默認情況下添加尾部斜線。我對斜槓重寫進行了一些小修改(請參閱我的答案) – user1578127 2012-08-06 05:49:13

1

我使用喬恩·林上面提供的,有輕微的修改規則,增加了尾部斜槓的解決方案:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L,R=301] 

這使得該規則的工作對於具有多個斜線在他們的地址,如

http://example.com/path/to/page 

主要重寫PHP是完全一樣的喬恩表示:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]