2014-12-03 122 views
1

我在使用存在於子目錄中的.htaccess文件刪除尾部斜線時遇到問題。在子目錄中使用.htaccess刪除尾部斜槓

通常情況下,這將是一個簡單的解決方法,因爲在堆棧溢出方面已經有幾個解決方案,類似類似,但結構不同,問題。這些解決方案不考慮.htaccess文件存在於子目錄中(而不是根級別)。

例如,假設我有以下文件結構:

/subfolder/.htaccess 
/subfolder/index.php 
... 

我想http://server/subfolder/後刪除所有尾隨斜線請求。例如,

  • http://server/subfolder/file/應該重定向到http://server/subfolder/file
  • http://server/subfolder/news/12/應該重定向到http://server/subfolder/news/12

我目前在/subfolder/.htaccess以下規則:

RewriteEngine On 

# Strip ending slash 
RewriteRule ^(.*)/$ $1 [L,R=301] 

# Pipe request to controller 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 

有了這個規則,上述示例重定向到以下內容:

  • http://server/subfolder/file/重定向到http://server/os/path/to/subfolder/file
  • http://server/subfolder/news/12/重定向到http://server/os/path/to/subfolder/12

即,代替使用從.htaccess點(/subfolder在這種情況下,)的相對路徑,它的使用的操作系統的路徑。

我可以通過修改.htaccess亡羊補牢使用RewriteBase

# Strip ending slash 
RewriteBase /subfolder 
RewriteRule ^(.*)/$ $1 [L,R=301] 

雖然這個工程,這不是期望的解決方案,因爲如果我將文件從/subfolder移到/newsubfolder,我會編輯.htaccessRewriteBase /newsubfolder。也就是說,無論何時將這些文件移動到不同的子文件夾,.htaccess文件都需要手動更新。因此,該組文件將不可攜帶,因爲它們需要手動配置.htaccess文件使用絕對路徑

我想要一個更具可移植性的解決方案,可以放在任何目錄下工作,不管其絕對路徑如何。最好這個解決方案不會使用RewriteBase,因爲根據我的理解,這不能設置爲當前的子目錄並且必須引用絕對路徑。

我花了好幾個小時試圖想出一個解決方案,但我見過的大多數想法都涉及到使用根目錄或涉及環境變量的一些討厭的黑客攻擊。任何想法都會很棒。

回答

1

您可以在subdolder的.htaccess使用這樣的規則:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \s/+(.+?)/+[?\s] 
RewriteRule /$ /%1 [R=302,NE,L] 

# generate rewrite base dynamically 
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$ 
RewriteRule ^(.*)$ - [E=BASE:%1] 

# Pipe request to controller 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^%{ENV:BASE}index.php [L] 
+0

你的答案部分工作。如果你有多個尾部斜槓(例如'/ subfolder/slash ///'),這些規則就會失敗,但是如果你正在路由一個目錄(比如從/子文件夾/公共文件到子文件夾)其中'.htaccess'在'/子文件夾/ p​​ublic/.htaccess'中)。 – 2014-12-03 16:02:42

+0

感謝您的更新。現在刪除了多個尾部斜槓。我仍然得到一個內部的幾個(500)錯誤與別名目錄。這發生在最後一行('^ index.php')。這可以通過使用'RewriteBase'來解決,但是您是否有任何建議來解決請求傳遞給控制器​​的問題? – 2014-12-03 20:45:23

+0

什麼是您用於別名目錄的確切URL?你能檢查Apache error.log是否有500錯誤的原因? – anubhava 2014-12-03 20:50:49