Apache - RewriteCond中的.htaccess正则表达式替换

时间:2017-04-15 11:48:38

标签: regex apache .htaccess mod-rewrite

要将localhost:8888/dev/test.php替换为localhost:8888/dev/test/,这是我创建的.htaccess

RewriteEngine on

RewriteRule ^/?(.*)/test/ /$1/test.php [NC,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /dev/test\.php [NC]
RewriteRule ^/?(.*)/test.php$ /$1/test/ [L,R=301]

我尝试将/dev/中的RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /dev/test\.php [NC]替换为/$1/以获取rewriteRule中的值,但这似乎不起作用,因为网址仍为http://localhost:8888/dev/test.php localhost:8888/dev/test/

  

在RewriteCond中替换/dev/所需的正则表达式格式应该是什么?

1 个答案:

答案 0 :(得分:2)

RewriteRule ^/?(.*)/test/ /$1/test.php [NC,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /dev/test\.php [NC]
RewriteRule ^/?(.*)/test.php$ /$1/test/ [L,R=301]

这些规则应该颠倒过来。 内部重写之前,外部重定向应为。否则,当重写过程重新开始时,它将被重写回/dev/test.php(第一个指令)。

例如:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /dev/test\.php [NC]
RewriteRule ^(.*)/test\.php$ /$1/test/ [L,R=301]

RewriteRule ^(.*)/test/ /$1/test.php [NC,L]

在每个目录.htaccess个文件中,模式开头的/?不是必需的。

THE_REQUEST的检查只是为了避免重定向循环。相反,您可以检查REDIRECT_STATUS环境变量,该变量在初始请求中为空:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)/test\.php$ /$1/test/ [L,R=301]

<强>更新

  

我想用^[A-Z]{3,9}\ /dev/test\.php

替换^[A-Z]{3,9}\ /$1/test\.php

由于您在RewriteRule 模式中使用了一个全能通配符,这种事情似乎没有必要吗?只需将它变成 CondPattern 中的通用通配符?例如:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*/test\.php\ HTTP [NC]

我还要问这里是否需要NC?你特别需要允许TEST.PHP等吗?