2012-04-18 29 views
4

我有一個.htaccess規則,基本上指明瞭通過一個頁面的所有訪問,並且我從那一點PHP處理它。因此,無論它在哪個目錄中,它都會將所有網址傳遞給此腳本。如何重寫url的子集(/ api/something)?

如果我的根/項目/(example.com/project/some/page/where)/一些/頁/哪裏會重定向到@ frontend.php

RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ @frontend.php 

我已經達到但是,我希望能夠將部分頁面推送到不同的處理程序,例如(example.com/project/api/page/where,而不是example.com/project/some/api/where) :

RewriteRule ^/api?$ @api.php 

問題是,這是行不通的,不管這條規則是高於還是低於另一條。任何人都可以建議我怎麼能做到這一點?

我也曾嘗試:

RewriteRule ^/api(/.*)? @api.php [L] 

RewriteCond %{REQUEST_URI} !/api 
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ @frontend.php [L] 

雖然這工作,因爲http://example.com/project/api/page/where不推送到@ frontend.php,它不會得到它@ api.php,併產生:

[Wed Apr 18 10:46:12 2012] [error] [client 127.0.0.1] File does not exist: /www/project/api 

編輯:

我的最新嘗試是:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^api(/.*)? @api.php [L] 

RewriteCond %{REQUEST_URI} ^api 
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ @frontend.php 

與這一個問題是,如果URL與除API /像(example.com/project/test/page/where)任何啓動它拋出錯誤:

[Sat Apr 21 10:50:13 2012] [error] [client 127.0.0.1] File does not exist: C:/xampp/www/projects/frame3/test 

回答

1

的問題是,第二個請求也是針對htaccess進行測試的,所以實際上您有兩個請求。因爲這個規則不適用於任何js/ico/gif。 您可以使用RewriteConds或regileros(更好)的方法使用Apache的{ENV:REDIRECT_STATUS}機制來管理此操作。有關更多信息,請參閱this問題。

編輯:我在http://playground.rexbooks.com/stack設置了一個小例子。如果你輸入,f.e. http://playground.rexbooks.com/stack/api/123456它會將您重定向到api.php。任何其他查詢將被重定向到frontend.php。線索是檢查一個文件是否真的存在。我也分解了你的其他規則。 RewriteBase僅適用於我的設置,您需要對其進行調整。爲了不使uris透明,請刪除重寫(R)標誌。這是你以後的事嗎?

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^api(/.*)? /api.php [L,R] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !api 
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ 
RewriteRule (.*) /frontend.php [L,R] 
+0

這很接近。雖然沒有RewriteBase工作。至此,這就是爲什麼@ frontend.php規則工作得如此之好以至於我不必設置RewriteBase。 – 2012-04-20 21:14:11

+0

我不得不承認,我真的不知道fronted.php之前的標誌是幹什麼的(完成任何事情?)。顯然,你可以有沒有RewriteBase的規則,你只需要寫下相對路徑。爲了讓它沒有RewriteBase,我編輯了我的示例。 – Jan 2012-04-21 06:02:12

+0

謝謝。 @符號除了使文件更加模糊之外別無其他,因此大多數人不會輕描淡寫。它根本沒有URL重寫的目的。如果我想要,我可以使用_,〜或=。 – 2012-04-21 13:34:18

0

在這裏,你去。這些類型的規則已經爲我工作:

# redirect Drupal urls straight to Drupal (or in your case api.php) 
    RewriteRule ^admin/(.*)$ api.php?q=admin/$1 [L,QSA] 
    RewriteRule ^admin_menu/(.*)$ api.php?q=admin_menu/$1 [L,QSA] 
    RewriteRule ^node/(.*)$ api.php?q=node/$1 [L,QSA] 
    RewriteRule ^content/(.*)$ api.php?q=content/$1 [L,QSA] 

    # Another way to redirect based on query strings  
    RewriteCond %{QUERY_STRING} ^q=([^&]+)$ 
    RewriteRule . api.php?q=$1 [L,QSA] 

    # if a directory or a file exists, use it directly 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico 

    # otherwise forward it to index.php 
    RewriteRule . index.php 

我有了這個運行集成一個Drupal/Yii框架的設置,它的工作比較順利。上述規則的組合應該可以幫助你走上正軌。

讓我知道你是否想讓我爲你的確切設置做進一步澄清。

1

將.htaccess放在包含「@frontend.php」和「@api」的目錄中。PHP的」文件具有以下內容:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^api @api.php [QSA,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^@frontend.php [QSA,L] 

!-f將防止重寫任何現有文件 否認重寫只對指定的擴展使用下面的.htaccess而不是

RewriteEngine On 

RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ 
RewriteRule ^api @api.php [QSA,L] 

RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ 
RewriteRule^@frontend.php [QSA,L] 

中當然以下行也應該工作,但是如果我們之後不使用它,捕獲api之後的內容有什麼意義...

RewriteRule ^api(/.*)? @api.php [L] 
+0

缺少文件擴展名排除。除此之外,這套規則是有效的。 – 2012-04-27 14:53:12

+0

好的......編輯後:) – smrtl 2012-04-28 00:02:01

+0

現在,/ api /地址不再工作。 mod_rewrite,你是一個痛苦的屁股。 – 2012-04-28 13:32:42