2012-07-09 43 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