遇到重写规则问题

时间:2009-09-07 17:39:15

标签: mod-rewrite redirect

我有一个应用程序,其中大部分仍在开发中,这就是为什么我需要在所有页面上阻止访问,但不是两个。

假设我有a.php,除了b.php之外,所有请求都会被重定向到这里。

所以我认为应该有3条规则:

1st: when a.php and b.php are requested they should be visible to user,

2nd: if anything other than those two is requested, 
     it should be redirected to a.php.

3rd: for external css,javascript and image files 
     there should be an access rule

由于我没有太多的服务器管理经验,我相信我完全迷失了:)

这是我试过的:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !^/b.php
RewriteRule !\.(js|ico|txt|gif|jpg|png|css)$ a.php

2 个答案:

答案 0 :(得分:2)

我不确定你对#3的意思,但是从你正在尝试的内容看,我想你的意思是,所有的js,ico,......都要重定向到a.php。是吗?

如果是这样,那意味着,a => a.php(带参数),b => b.php(带参数)和其他=> a.php只会。所以试试这个:

RewriteBase /
RewriteRule ^a\.php(.*) /a.php$1
RewriteRule ^b\.php(.*) /b.php$1
RewriteRule ^.*         /a.php

但是,如果您的意思是所有这些脚本和媒体文件都可以正常访问,请尝试以下方法:

RewriteBase /
RewriteRule ^a\.php(.*)                          /a.php$1
RewriteRule ^b\.php(.*)                          /b.php$1
RewriteRule ^(.*)\.(js|ico|txt|gif|jpg|png|css)$ /$1.$2

基本上,重写规则是正则表达式,$ 1,$ 2,...是匹配字符串组(用“(”和“)”包装的那些)。

希望得到这个帮助。

答案 1 :(得分:2)

实际上,你会交换第二和第三条规则,因为你的第二条规则是默认路线:

# 1st
RewriteRule ^(a\.php|b\.php)$ - [L]

# 3rd
RewriteRule \.(js|ico|txt|gif|jpg|png|css)$ - [L]

# 2nd
RewriteRule !^a\.php$ a.php [L]

替换-表示URI未更改。