.htaccess mod_rewrite:第一场比赛后如何停止?

.htaccess mod_rewrite:第一场比赛后如何停止?,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我有一个PHP应用程序,它使用GET变量来确定语言,即: http://example.com/?lang=en 我正在编写一个mod_重写规则,以便人们可以使用SEO友好的URL访问它: http://example.com/en/ 到目前为止,My.htaccess的外观如下所示: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^[a-z]{2} /test.php?lang=$0 [L] (test.

我有一个PHP应用程序,它使用GET变量来确定语言,即:

http://example.com/?lang=en
我正在编写一个mod_重写规则,以便人们可以使用SEO友好的URL访问它:

http://example.com/en/
到目前为止,My.htaccess的外观如下所示:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[a-z]{2} /test.php?lang=$0 [L]
(test.php只是一个测试,而不是我真正应用程序的名称)

但当我访问时:

http://example.com/fr/blabla
我在重写日志中得到的信息如下:

192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b8ce58/initial] (3) [perdir /var/www/html/example/] add path info postfix: /var/www/html/example/fr -> /var/www/html/example/fr/blabla
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b8ce58/initial] (3) [perdir /var/www/html/example/] strip per-dir prefix: /var/www/html/example/fr/blabla -> fr/blabla
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b8ce58/initial] (3) [perdir /var/www/html/example/] applying pattern '^[a-z]{2}' to uri 'fr/blabla'
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b8ce58/initial] (2) [perdir /var/www/html/example/] rewrite 'fr/blabla' -> '/test.php?lang=fr'
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b8ce58/initial] (3) split uri=/test.php?lang=fr -> uri=/test.php, args=lang=fr
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b8ce58/initial] (1) [perdir /var/www/html/example/] internal redirect with /test.php [INTERNAL REDIRECT]
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b92310/initial/redir#1] (3) [perdir /var/www/html/example/] strip per-dir prefix: /var/www/html/example/test.php -> test.php
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b92310/initial/redir#1] (3) [perdir /var/www/html/example/] applying pattern '^[a-z]{2}' to uri 'test.php'
192.168.172.1 - - [24/Feb/2015:16:30:10 +0100] [example.com/sid#896a010][rid#8b92310/initial/redir#1] (1) [perdir /var/www/html/example/] pass through /var/www/html/example/test.php
我不明白的是,为什么在第一次匹配之后(日志中的第四行),mod_rewrite会一次又一次地保持匹配和重定向。我发现有几个人在这里发布了类似的问题,作为他们回答的结果,我尝试添加
RewriteCond
规则,但mod_rewrite似乎忽略了它(是的,test.php确实存在于我的文件系统中)。发生什么事了

编辑:忘了提了。我正在测试的服务器是Apache2.2.3


编辑:无需担心。这是我的test.php中的一个输入错误,它妨碍了正确执行(您能在这里添加一个“眼卷”或“尴尬”表情吗?

在首次重写后停止,您可以使用:

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[a-z]{2} test.php?lang=$0 [L,QSA]
%{ENV:REDIRECT_STATUS}
是内部变量,在Apache首次重写后设置为200


但是
RewriteCond%{REQUEST\u FILENAME}-如果
test.php
有效文件

您的重写日志输出在创建时未显示任何重写条件到位的迹象,则f
应在首次重写后停止重写循环。请在RewriteCond就绪的情况下显示实际的日志输出。我可以向您保证RewriteCond一直存在。事实上,为了以防万一,我再次尝试重新启动Apache,但结果仍然是一样的。没有工作(日志与以前完全相同)。我的Apache服务器是2.2.3。这有什么影响吗?它肯定有效,不要依赖于重写日志的解释。如果它继续重写,则会得到无限循环,否则会多次得到
lang=
参数。我所说的“不工作”是指我的test.php文件有一些静态HTML文本,然后是一条简单的php指令,它会打印$\u get['lang']的值。如果它工作,它应该显示静态文本,然后在上面的例子中打印“fr”,然而我得到的只是一个空白屏幕。(另外,查看日志中倒数第二行:它正在将正则表达式再次应用于已重定向的URL)。要单独测试它,请使用此代码创建一个名为
info.php
的文件
,然后将上面的规则更改为
RewriteRule^[a-z]{2}/?$info.php?lang=$0[L,QSA]
,然后查看在浏览器中得到什么。