.htaccess - 需要翻译外行术语

时间:2013-12-16 10:44:24

标签: regex apache .htaccess mod-rewrite

我的.htaccess正在运行Zend框架,我们的一位开发人员之前添加了此代码:

RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)/index.php$ http://www.mydomain.com/$1 [R=301,L]

有人可以为我翻译成英文吗?我相信它是说,如果有人试图访问index.php,那么执行301重定向到主域(即不显示世界“index.php”存在)。当RewriteRule看起来有相同的规则时,我不知道为什么RewriteCond存在,也许这是一个错误。无论如何我不知道它是否工作,因为有其他规则,我的网站实际上可以访问index.php文件(没有重定向)所以也许可以完全删除上述。寻找合适的翻译来理解。

非常感谢!

2 个答案:

答案 0 :(得分:1)

实际上这里需要RewriteCondRewriteRule。但首先,这条规则不会起作用。

正确的工作代码将是:

RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

主要区别在于/中存在RewriteRulehttp://domain.com/index.php会失败{/ 1}}

<强>解释

  • THE_REQUEST变量表示Apache从您的浏览器收到的原始请求
  • 您需要将URI与THE_REQUEST匹配,以确保原始URI中存在/index.php,而不是/index.php
  • 内部重写的结果
  • 如果您删除RewriteCond它可能仍然有用,但您必须确保没有任何规则会将您的URI重写为/index.php任何位置。

答案 1 :(得分:1)

RewriteCond test string 包含服务器变量%{THE_REQUEST},其格式为:

GET /index.php HTTP/1.1
or
POST /login.php HTTP/1.1


条件模式 ^.*/index.php包含一个正则表达式,用于匹配其中包含/index.php的任何内容...

^标记字符串的开头,.*匹配任何字符的零个或多个实例,/index.php不言自明

因此,任何包含/index.php的网址都会匹配。如果条件模式$符号(字符串结尾符号)结束,那么它将%{THE_REQUEST}的任何实例都不匹配%{THE_REQUEST}的所有实例1}}包含URL之后的HTTP请求类型。


然后RewriteRule用于执行301重定向,但重要的是,RewriteRule directive模式与当前网址相匹配(而不是针对整个网址)请求字符串,如本例中RewriteCond所做的那样)。

RewriteRule 模式 ^(.*)/index.php捕获(括号表示)/index.php前面的所有内容,然后创建301重定向,删除/index.php。< / p>


@anubhava指出,如果您访问website.com/index.php,那么RewriteRule将无效,因为它匹配的网址不包含前导/


这两行可以改写为:

RewriteRule ^(.*)index.php$ http://www.mydomain.com/$1 [R=301,L,NC]

然后,如果您访问http://website.com/index.php,那么模式(.*)部分将与空字符串匹配。

或者,如果您访问http://website.com/sub/folder/index.php,那么模式(.*)部分将匹配sub/folder/,然后在替换中引用字符串$1


请记住,每个重定向的工作方式都是告诉浏览器请求新的URL,并且每个请求都会被htaccess重新处理,所以如果有其他规则允许查看index.php那么这可以解释为什么你可以看一些包含index.php的网址。