重写规则混乱

时间:2010-10-30 12:27:59

标签: mod-rewrite

我正在努力实现这个简单的事情......

我有一些静态页面应该像
一样 www.domain.com/profile等.. 问题是如何编写重写规则以便...

会有一些固定的重写         喜欢/ home

我希望每个存在的文件都不会被重写         www.domain.com/test.php应该去         test.php的

最后如果找不到,我希望将它重定向到static.php?_....。

RewriteRule ^/home/?$ /index.php?__i18n_language=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]+)/?$ /static.php?__i18n_language=$1  

这样可以正常但是如果我输入index.php或test.php甚至是其他重定向的mach它会让我进入static.php ... 请帮忙!

2 个答案:

答案 0 :(得分:1)

我很长一段时间没用过这个,但是我找到的东西应该有所帮助。它是旧脚本的一部分,只有在找不到文档时,才会生成 .httaccess 文件,以便从 / usr / share / doc 重定向: 规则是“检查,如果目标网址存在,则离开”:

RewriteEngine On
RewriteBase /doc/User_Documents

### If the directory already exists, then leave
### We're just redirecting request when the directory exists but has been renamed.

RewriteCond %{REQUEST_FILENAME} User_Documents/([^/]+-[0-9][^/]*)
RewriteCond $PWD/%1 -d
RewriteRule .* - [L]

如果其中一个条件匹配,则[L]表示离开。在旧脚本中,有数百个生成的规则(在[L]之后)被跳过,因为其中一个条件匹配。在您的情况下,当找到目标%{REQUEST_FILENAME}时,您将跳过其余规则。

所以,我建议,在重定向规则之前:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]

答案 1 :(得分:1)

根据您的描述,您可以使用以下规则:

# stop rewriting process if request can be mapped onto existing file
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteRule ^ - [L]

# rewrite known paths /home, /foo, /bar, etc.
RewriteRule ^/(home|foo|bar|…)$ /index.php [L]

# rewrite any other path
RewriteRule ^ /static.php [L]