mod_rewrite的复杂规则

时间:2012-05-03 21:18:06

标签: apache mod-rewrite

请帮我创建mod_rewrite的正确说明。这似乎很难。

我需要以下内容:

1。 重定向 www.site.com site.com

www.site.com/hello                ==>     site.com/hello
www.site.com/abc/def              ==>     site.com/abc/def

等,然后应该应用其他规则。

2。直接访问(不重写)某些指定的文件和文件夹(例如 robots.txt,images / 等)

也许

RewriteCond %{REQUEST_URI} !^/(robots.txt|favicon.ico|images|documents|~.\*)

我是对的吗? 所以,像

这样的网址
site.com/robots.txt               ==>     site.com/robots.txt
site.com/documents/file1.pdf      ==>     site.com/documents/file1.pdf

应保持原样,不应重写。

3。另一个转变:

site.com/index.php?anythinghere   ==>     site.com/a/index.php?anythinghere

4。但是如果我们键入URL site.com和site.com/ Apache应该在根文件夹(site.com/index.php)中调用index.php

site.com                          ==>     site.com/index.php
site.com/                         ==>     site.com/index.php

5。我有MVC脚本,如果我们键入以下URL:

1. site.com/controller or site.com/controller/ or site.com/controller//
2. site.com/controller/function or site.com/controller/function/
3. site.com/controller/function/parameter or site.com/controller/function/param1/param2/param3

如果控制器是列表中的预定义词之一,例如“索引”,“新闻”,“联系人”(也许它会扩展到几百个单词),然后我们应该调用index.php,按以下方式重写URL:

site.com/controller               ==>     site.com/index.php?q=controller
site.com/controller/              ==>     site.com/index.php?q=controller/
site.com/controller//             ==>     site.com/index.php?q=controller//
site.com/controller/function      ==>     site.com/index.php?q=controller/function
site.com/controller/function/     ==>     site.com/index.php?q=controller/function/
site.com/controller/function/parameter               ==>  site.com/index.php?q=controller/function/parameter
site.com/controller/function/param1/param2/param3    ==>  site.com/index.php?q=controller/function/param1/param2/param3

6。最后,如果未应用所有先前的规则,我们应该重写

site.com/anythinghere             ==>     site.com/a/index.php?anythinghere

希望apache不会递归地使用mod_rewrite,否则我会遇到与index.php不同的巨大麻烦。

我知道这并不容易,但如果你能帮助创建一个项目的规则,那就太棒了。

提前致谢!

1 个答案:

答案 0 :(得分:0)

对于第一次重写,您可以将这些行放在.htaccess中:

RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301]

放置R=301以使其成为永久重定向非常重要,这样搜索引擎就不会将www.site.comsite.com视为两个不同的网站。

对于第二次重写,可以使用许多选项。对于您来说,让apache服务于实际存在的所有文件(例如图像和pdf文档)并重写那些意味着某些MVC命令的URL会更有用。

如果您这么认为,可以覆盖第五次重写,并写下:

RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f 

RewriteRule ^/news$ ./index.php?news  [L]
RewriteRule ^/news/(.*)$ ./index.php?news/$1  [L]

对于你拥有的每个controller等等。如果您计划拥有数百个控制器,那么我认为您应该重新考虑系统的设计,或者让它们成为几个主控制器的子控制器,这样这些主控制器就可以写在这个.htaccess文件中。

同样重要的是L,它告诉apache它是执行的最后一行(如果与条件匹配则是最后一行),所以你要避免递归(如果我记得很清楚的话还有其他内容)。

涵盖第三一个:

RewriteRule ^/index.php?(.*)$ ./a/index.php?$1  [L]

涵盖第六和最后一个

RewriteRule ^/(.*)$ ./a/index.php?$1  [L]

因此,覆盖重写1,2,3,5和6我们可以:

RewriteEngine On

# First rewrite
RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301]

# Second and fifth rewrite
RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f 

RewriteRule ^/news$ ./index.php?news  [L]
RewriteRule ^/news/(.*)$ ./index.php?news/$1  [L]

# Third rewrite
RewriteRule ^/index.php?(.*)$ ./a/index.php?$1  [L]

# Sixth rewrite
RewriteRule ^/(.*)$ ./a/index.php?$1  [L]