2014-01-27 41 views
1

這是我的.httaccess文件。mod_rewrite行事怪異

Options +FollowSymLinks 
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www.mysite.com [NC] 
RewriteRule ^(.*)$ mysite.com/$1 [L,R=301] << http: has been deleted to post this message. 
RewriteBase/
RewriteRule ^gallery/([^/]*)$ /gallery.php?page=$1 [L,NC,QSA] 
RewriteRule ^venues/([a-zA-Z0-9-/]+)/$ /venues.php?page=$1 [L,NC,QSA] 

可以完美兼容之前創建的鏈接,

一樣,如果網址是:

mysite.com/gallery/my-old-link

模塊將其重寫爲mysite的。 com/gallery.php?page = my-old-link

剛剛添加了一個新類別,沒什麼特別的,相同的字符 -

mysite.com/gallery/my-new-link

我期待模塊將其重寫爲

mysite.com/gallery.php?page=my-new-link

但是,讓這:

mysite.com/gallery/my-new-link/?page=my-new-link

並與403錯誤消息的網頁:

禁止

您沒有權限訪問/ gallery/my-new-link /在此 服務器上。

此外,在嘗試 使用ErrorDocument來處理請求時遇到404未找到錯誤。

+0

嘗試評論你的第一個301規則,然後在新的瀏覽器中重新測試。 – anubhava

+0

是否有一個名爲'/ gallery/my-new-link'的目錄? –

+0

@anubhava那麼它根本不起作用。 –

回答

0

由於在/gallery/my-new-link有一個目錄,目錄由mod_dir處理,因爲它缺少尾部斜線。什麼mod_dir會嘗試做的是重定向一個缺少尾部斜槓的目錄的請求到相同的請求,但與尾部斜槓。這個重定向發生在mod_rewrite重寫URI的同一時間,並且兩者都被應用於相同的請求,導致不可靠的重定向。

這意味着你將需要關閉mod_dir,但是這是一種不好的:

DirectorySlash文件說:

關閉尾隨斜線重定向可能會導致信息泄露。考慮mod_autoindex處於活動狀態(Options + Indexes)和DirectoryIndex設置爲有效資源(比如index.html)並且沒有爲該URL定義其他特殊處理程序的情況。在這種情況下,帶有斜線的請求會顯示index.html文件。但是沒有斜槓的請求會列出目錄內容。

所以你需要打開關閉 mod_dir同時,也試圖通過重定向請求目錄缺少尾隨斜線相同的請求結尾的斜線做mod_dir做什麼:

DirectorySlash Off 
Options +FollowSymLinks 
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www.mysite.com [NC] 
RewriteRule ^(.*)$ mysite.com/$1 [L,R=301] << http: has been deleted to post this message. 
RewriteBase/
RewriteRule ^gallery/([^/]*)$ /gallery.php?page=$1 [L,NC,QSA] 
RewriteRule ^venues/([a-zA-Z0-9-/]+)/$ /venues.php?page=$1 [L,NC,QSA] 

# redirect with trailing slash for directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ /$1/ [L,R] 
+0

謝謝你,我改變了一下後,你的工作在這裏:RewriteRule^gallery /([a-zA-Z0-9 - /] +)$ /gallery.php?page=$1 [L,NC,QSA] –