我的.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文件(没有重定向)所以也许可以完全删除上述。寻找合适的翻译来理解。
非常感谢!
答案 0 :(得分:1)
实际上这里需要RewriteCond
和RewriteRule
。但首先,这条规则不会起作用。
正确的工作代码将是:
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]
主要区别在于/
中存在RewriteRule
,http://domain.com/index.php
会失败{/ 1}}
<强>解释强>
THE_REQUEST
变量表示Apache从您的浏览器收到的原始请求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的网址。