请帮我创建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不同的巨大麻烦。
我知道这并不容易,但如果你能帮助创建一个项目的规则,那就太棒了。
提前致谢!
答案 0 :(得分:0)
对于第一次重写,您可以将这些行放在.htaccess中:
RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301]
放置R=301
以使其成为永久重定向非常重要,这样搜索引擎就不会将www.site.com
和site.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]