2014-01-21 93 views
5

我試圖強制使用位於/app/webroot的.htaccess中的以下內容刪除或添加尾部斜線到我的CakePHP 2.x應用程序。在Apache上使用.htaccess從CakePHP 2.x刪除或添加尾部斜槓

#<IfModule mod_rewrite.c> 
# RewriteEngine On 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteRule^index.php [L] 
#</IfModule> 


<IfModule mod_rewrite.c> 
# Add trailing slash 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|)$ 
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301] 
</IfModule> 

以下對添加了結尾的斜線。

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L] 

但我不想強制執行域,因爲它可以在本地或子文件夾內運行。我該如何解決?我在網上閱讀的所有文檔似乎都強制執行應用程序的完整網址。

事實上,即使我使用FULL url,它仍然不起作用。有沒有人設法與CakePHP一起工作?看來你必須運行它通過index.php文件

爲了澄清我正在尋找一個解決方案,添加和刪除尾隨在CakePHP的斜槓,而無需將網址硬編碼到.htaccess文件。

+0

你能提供例如像這個網址到那個網址,如果可能的話? – Anubhav

+0

你想達到什麼目的?如果您在URL中輸入尾部斜槓,cake會默認刪除它們並顯示正確的頁面。 您是否試圖從HTMLHelper或路由器生成的URL中刪除尾部的斜槓? –

+0

蛋糕不會刪除它們!如果我輸入'http:// domain.com/posts /'或'http:// domain.com/posts',兩者都可以工作,第一個不會刪除結尾的斜槓,因此可以在BOTH網址訪問該頁面。我想使它的尾部斜槓被刪除。 – Cameron

回答

7

這通常不是一件複雜的事情。

這是怎麼回事?

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # if this is an existing folder/file then leave 
    RewriteCond %{REQUEST_FILENAME} -d [OR] 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteRule . - [L] 

    # if trailing slash then redirect to url without trailing slash 
    RewriteRule ^/?(.+)/$ /$1 [R=301,L] 

    # internal rewrite to controller/dispatcher index.php 
    RewriteRule ^.*$ /index.php [L,QSA] 
</IfModule> 

如果這一個不工作,那麼這可能是一個問題在你身邊。
您之前是否已經使用mod_rewrite?它啓用了嗎?


編輯:如果您的網站不在根文件夾(DOCUMENT_ROOT),您有2個選項。你可以把你的htaccess文件夾放到application文件夾或根文件夾中。

我建議你把你的htaccess放在你的application文件夾裏(專用於你的網站)。否則,代碼將不完全相同。下面是在這種情況下,代碼:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase /application/ 

    # if this is an existing folder/file then leave 
    RewriteCond %{REQUEST_FILENAME} -d [OR] 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteRule . - [L] 

    # if trailing slash then redirect to url without trailing slash 
    RewriteRule ^/?(.+)/$ $1 [R=301,L] 

    # internal rewrite to controller/dispatcher index.php 
    RewriteRule ^.*$ index.php [L,QSA] 
</IfModule> 

你的第二個問題:

Also what would be the code for ENFORCING a trailing slash?

您可以處理與此代碼(只有一行改變)

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase /application/ 

    # if this is an existing folder/file then leave 
    RewriteCond %{REQUEST_FILENAME} -d [OR] 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteRule . - [L] 

    # if no trailing slash then redirect to url with trailing slash 
    RewriteRule ^/?(.+)([^/])$ $1$2/ [R=301,L] 

    # internal rewrite to controller/dispatcher index.php 
    RewriteRule ^.*$ index.php [L,QSA] 
</IfModule> 
+0

在index.php加載網站之前刪除'/',但除了將我重定向到服務器的根目錄外(如果我在'localhost:8888/application/posts本地運行它) /'它會重定向到'localhost:8888/posts')注意這隻會發生,如果我把尾部斜槓打開。它不處理子文件夾'應用程序'。 – Cameron

+0

這樣做的效果:'RewriteRule^/?(。+)/ $ http://%{HTTP_HOST}/application/$ 1 [R = 301,L]'但是我可以避開必須在應用程序文件夾中編碼嗎? – Cameron

+0

另外什麼是執行尾部斜槓的代碼?謝謝。 – Cameron

0

試試這個:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|)$ 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301] 
</IfModule> 
+0

給我錯誤:在此服務器上未找到請求的URL/cavrn/app/webroot/posts /。所以它需要通過原始重寫規則中的webroot內的index.php文件進行路由。 – Cameron

+0

我很抱歉,但我不明白什麼是行不通的,或者我從一開始就明白你的問題......: -/ – Georgio

0

試試這個(bakery):

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
#RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [L,R=301] 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [L,R=301] 

如果你想這樣做的搜索引擎優化你總是必須使用規範的鏈接,並停止操心重定向選項:

<link rel="canonical" href="/your_controller/action/"/> 
+0

和@:Georgio發佈的一樣,這不起作用。看來你必須在規則中有index.php,否則它最終會將你重定向到應用程序的webroot文件夾。有任何想法嗎? – Cameron

+0

怎麼樣RewriteRule^index.php [L]? – bancer