2013-03-07 55 views
16

顯然,在整個web上有很多mod重寫討論和答案。但是,我很難抓住他們。所以我想我會在這裏問。爲apache 2重寫規則以便與角色js一起使用

我要求重寫規則做安迪喬斯林在這裏評論解釋說:https://stackoverflow.com/a/11100438

這是在example.com的根

  • 應用程序/
  • 我的當前目錄結構
  • app/index.html(角度js應用程序的「根目錄」)
  • api(這將是一個用於'api'的symfony 2應用程序。我將向此處發送ajax請求角度)。

我想將所有請求重定向到app/index.html,除了對/ api的請求。

例如:

http://example.com/categories/electronics/ipod居然會像去http://example.com/app/index.html/categories/electronics/ipod

我想爲應用程序/ index.html的一部分,然而隱藏。

然後,對http://example.com/api的請求會有一個例外,因爲我需要對這些url路徑發出ajax請求。

感謝您的任何幫助/指導。

+7

我不認爲這個問題應該關閉它是關於angularjs和url-rewrite這兩個主題都是相關的。 – elviejo79 2013-03-13 22:28:22

+0

這是沒有意義的,這是標記爲「脫離主題」。這不是主題。 – 2013-03-15 18:33:25

+0

@casperOne,請打開此備份。 – 2013-03-15 18:34:28

回答

13

這裏的東西,讓你去(把這個你/.htaccess文件中):

Options +FollowSymLinks 
IndexIgnore */* 
RewriteEngine on 

# if a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_URI} !/api 

# otherwise forward it to index.html 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^app/. /app/index.html [NC,L] 
+0

謝謝,我會盡我所能。我現在正在通過一個關於重寫的流行教程。我在想,我想要做的不是僅僅因爲存在就提供文件。問題是有人可能會要求什麼角度調用一個'部分'文件,它會爲它服務,等等。我將重定向到app/index.html然後我會明確地跳過某些目錄,如css/img/ – 2013-03-08 02:36:32

+1

這段代碼幾乎解決了我的問題......我不得不改變應用規則一點,我離開了我的工作示例在這個答案:http://stackoverflow.com/a/15415902/54848 – elviejo79 2013-03-14 17:19:34

+0

does not for me for = (http://take.ms/DyLaQ – fdrv 2015-12-09 17:25:25

18

接受的這個問題的答案是過時的。您現在可以在Apache 2.2.16+的conf文件中使用FallbackResource指令。

FallbackResource /app/index.html 

如果你想FallbackResource指令忽略「/ API」路線:

<Directory /api> 
FallbackResource disabled 
</Directory> 
+1

保存該文件的位置,但是,如何忽略對「/ api」的請求時使用這個命令?這是我最初的問題。 – 2016-04-05 22:08:13

+1

它可以,如果你將它設置爲特別忽略/ api路線。我編輯了答案來反映這一點。 – 2016-04-06 18:36:44

0

這個答案的問題是,你仍然要爲文件未找到404。根據一個人如何構建他們的前端應用程序,人們很容易讓css或其他文件返回404,特別是如果他們正在構建更大的動態應用程序,或者正在外包前端工作。另外,角度路由通常與文件系統上的任何內容無關。如果您將其縮小到單個目錄,上述可能會有效。例如,我會經常爲與文件系統佈局(/ ajs /)無關的所有角度路由使用通用前綴。如果你能做

<Directory /ajs> 
FallbackResource /app/index.html 
</Directory> 

然後它會更有意義,但這似乎並不適用於我。無論後端如何,使用通用前綴還會使後端規則變得更加簡單。例如,如果您不使用反向代理,則可以設置簡單的服務器轉發控制器。它使建模你的Apache重寫規則很簡單。例如:

RewriteEngine On 
RewriteRule ^/ajs/(.+)$ /index.html 

這麼說,我還沒有看到目錄/回退方法之前,讓我有興趣去探索它,當我需要的只是重寫是角前進。謝謝!

0

這是斯科特·弗格森的出色答案的細微變化和細化。我發現使用<Location>指令比<Directory>更容易。 <Directory>指令採用的絕對路徑名稱在不同的機器上可能不同。

因此,假設您的Angular應用程序的index.html位於您的Web服務器文檔根目錄下的my-app/index.html中。並且您希望使用http://localhost/my-app訪問該應用。

首先確保你的base href是「/ my-app /」。接下來,在你的httpd.conf文件中加入:

<Location "/my-app"> 
    FallbackResource /my-app/index.html 
</Location> 

這將使阿帕奇如果/my-app/下的任何資源無法找到加載的index.html。

如果您在相同路徑下進行API調用,例如說/my-app/api,那麼您應該不會爲這些調用應用FallbackResource規則。所以補充:

<Location "/my-app/api"> 
    FallbackResource disabled 
</Location>