2012-03-20 78 views
0

我到处看看网上的教程htaccess的都是非常基本的。他们没有解释什么从哪里获得advenaced htaccess的turorials

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

[NC][R=301,L]平均(我可以计算的301 REDIR寿)

而且哪里的%{HTTP_HOST}令牌进来吗?还有其他什么?什么时候捕获了$1? ...

是否有解释这一切的任何教程?

编辑:下面是我的mguymon htaccess文件:

Options -Indexes 
ErrorDocument 404 /404.php 
CheckSpelling on 

RewriteEngine On 
RewriteBase/ 
###### Check for alias module to be installed ###### 

###### Domain without www ###### 
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L] 

###### End www rewrite section ###### 

# Remove multiple slashes anywhere in URL 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

# Remove multiple slashes after domain 
RewriteCond %{HTTP_HOST} !="" 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ 
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php?$1 [L] 

# show mysite.com/index.php always as mysite.com/ 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ 
RewriteRule ^index\.php$ http://mysite.com/ [R=301,L] 

这将改变www.mysite.com/index.php/////index.phpmysite.com这是每一个与他们[L]开关

+0

教程不是参考。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html – 2012-03-20 01:24:07

回答

1

Apache .htaccess文件使用标准的Apache配置,例如Mod RewriteMod Rewrite文档解释了RewriteCond和RewriteRule的运行方式。

我会打破你的ModRewrite问题:

RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
  • RewriteCond是一个条件,以确定是否重写应该发生。
  • %{HTTP_HOST}指的RewriteCond正在检查请求
  • ^www\.mysite\.com$的主机名的图案,如果主机名匹配www.mysite.com
  • [NC]检查意味着无的情况下,使图案匹配的情况下不敏感的

例如,如果有人请求http://www.mysite.com/index.html,则RewriteCond将检查主机www.mysite。com针对^www\.mysite\.com$的模式,并且由于它匹配,将执行以下RewriteRule。

RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L] 
  • RewriteRule为电动工具改写请求
  • ^(.*)$是模式,这将匹配一切。如果模式不匹配,则RewriteRule将不会执行。
  • http://mysite.com/$1是重写,基本上将请求从www. mysite.com更改为mysite.com。
  • [R=301,L]表示重写应发送301重定向,并成为最后一次重写规则运行。

持续的http://www.mysite.com/index.html的例子中,其经过的RewriteCond,/index.html将匹配^(.*)$图案,重写将被设置为http://mysite.com/index.html和发送作为301重定向并没有进一步RewriteRules会发生。


编辑:思考的配置

从我的经验,你希望所有的重定向在你的配置的顶部。特别是在你的事业中,如果你正在试图规范你的网址,那么请求将通过一系列重定向来清除。一旦完成,您将重写以提供正确的内容。考虑到这一点,这里是最后2条规则微调的配置:

# show mysite.com/index.php always as mysite.com/ 
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ 
    RewriteRule ^index\.php$ http://mysite.com/ [R=301,QSA,L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^/(.*)$ /index.php?a_param=$1 [QSA] 

关闭我的头顶,我无法验证RewriteCond %{THE_REQUEST},但它看起来不错。我怀疑你想[QSA]标志是查询字符串追加。这将导致http://mysite.com/index.php?user=blah重定向到http://mysite.com/?user=blah。如果您需要使用重定向传递查询字符串,则需要将QSA添加到其他重定向。

最后一条规则是确定是否应该使用index.php而不是htaccess(目录,图像,js等)目录中的静态内容。你不希望这是重定向,而是重写。不要使用[R]或[L],但要再次添加[QSA]。匹配的模式应该设置为传递给index.php的特定参数。

这与以前的规则组合会导致http://mysite.com/index.php?user=blah重定向到到http://mysite.com/?user=blah然后是重写,因此index.php用于http://mysite.com/?a_page=&user=blah。请求http://mysite.com/a_page?id=7将被重写,因此index.php用于http://mysite.com/?a_param=a_page&user=blah

+0

我见过很多带有多个重写规则的htaccess文件,它们都具有'[L]'在第一个不能运行后没有任何意义。 – qwertymk 2012-03-20 12:11:32

+0

正确,这意味着只有1个RewriteRule会运行。通常这是为了防止规则重叠。 RewriteRule模式将确定是否运行规则,因此根据请求,第一个RewriteRule不会每次都运行。 – mguymon 2012-03-20 12:25:56

+0

我的htaccess一次应用超过1条规则,他们都有'[L]'开关。 – qwertymk 2012-03-20 12:32:57

1

退房的Apache documentation三个规则。它解释了括号内[]中所有选项的含义。

  • [NC]没有情况下的(或不区分大小写)
  • [R=301]是301(永久)重定向
  • [L]意味着最后一个规则或停止重写

%{HTTP_HOST}是代表一个server or environment variable主机的基本URL,例如www.example.com

如果你了解正则表达式,你也应该明白,分组开始^之间(.*)匹配所有字符,并结束路径(整个路径),然后你就可以在第二部分用作为$1$

+0

查看我的编辑,'[L]'标志不会阻止它应用更多的规则。 – qwertymk 2012-03-20 12:50:16