2012-07-09 88 views
0

我試圖重寫我的網址在遞歸與mod_rewrite的

localhost/myapp/view/something or 
localhost/myapp/crud/something 

形式

localhost/myapp/view.pl?view=something or 
localhost/myapp/crud.pl?action=something 

所有其他請求應被這樣映射: 本地主機/ MYAPP /登錄 localhost/myapp/login.pl

我試過用這個.htaccess文件,但我得到了一個遞歸如果我啓用了最後的 RewriteRule,我不明白爲什麼,因爲我用RewriteCond保護它。 這是我第.htacces mod_rewrite的文件,所以請耐心等待與我同在)

RewriteEngine On 

RewriteRule ^/?crud/([^/]*)$ /myapp/crud.pl?action=$2 [QSA] 

RewriteRule ^/?view/([^/]*)$ /myapp/view.pl?view=$2 [QSA] 

RewriteCond $1      !^/(view|crud)$ 
RewriteRule ^/?([^/]*)$   /myapp/$1.pl [QSA] 

更新:

我刪除了前導/並添加[L]標誌,現在我得到以下錯誤Apache的錯誤.LOG:

[Mon Jul 09 11:55:33 2012] [error] [client 127.0.0.1] File does not exist: /srv/http/myapp/myapp 

新文件:

RewriteRule ^crud/([^/]*)$ myapp/crud.pl?action=$2 [L,QSA] 
RewriteRule ^view/([^/]*)$ myapp/view.pl?action=$2 [L,QSA] 

RewriteCond $1    !^(view|crud)$ 
RewriteRule ^([^/]*)$   myapp/$1.pl [QSA] 
+0

檢查出mod_rewrite標誌 - http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriteflags也許[L]會幫助你。 – hovanessyan 2012-07-09 09:27:13

+0

這是一次令人印象深刻的火焰嘗試。 :-)'.htaccess'規則不需要前導'/?'。同上放棄替代品上領先的'/'。 (請閱讀「每個目錄」語法)。同樣,cond regexp應該是'!(view | crud)'。加上[L]標誌。 – TerryE 2012-07-09 09:38:07

+0

好吧,我擺脫了領先的/並添加了[L]標誌,現在我在error_log中獲得這個:/ srv/http/myapp/myapp – zbenjamin 2012-07-09 10:01:17

回答

1

由於您的URI包含myapp,我假設這是DOCroot/myapp/.htaccess,在這種情況下,您的基礎是/ myapp /,並且所有重寫都與此相關。 (文檔中查找「每目錄」)。

RewriteEngine On 
RewriteBase /myapp/ 

RewriteRule ^crud/([^/]*)$ crud.pl?action=$2 [L,QSA] 
RewriteRule ^view/([^/]*)$ view.pl?action=$2 [L,QSA] 

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteRule ^(\w+)$   $1.pl    [L,QSA,NS] 

我也只要改變了過去的規則改寫爲尿路感染/ MYAPP/XXXXX(任何文字),以/myapp/xxxxx.pl因爲它不映射到文件或目錄名稱。

也期待在Tips for debugging .htaccess rewrite rules,並在你的情況下,因爲你有機會獲得Apache的配置,考慮啓用RewriteLogRewriteLogLevel在您的系統配置(或LogLevel alert rewrite:trace3如果您使用的是Apache 2.4)。

+0

完美謝謝! – zbenjamin 2012-07-09 13:37:20

+0

我可以選擇每個前綴作爲RewriteBase嗎?例如重寫/應用程序到/ myapp? – zbenjamin 2012-07-09 13:37:54

+0

在RewriteBase上閱讀doc'n。你應該只有1個.htaccess文件給出獲取到這個目錄的基本URI。還要檢查我鏈接到的調試提示Q,它解釋了什麼時候執行了哪些.htaccess文件。您通常會在'DOCroot/.htaccess'文件中將/ app/app重寫爲/ myapp。 – TerryE 2012-07-09 13:44:32