要将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/
所需的正则表达式格式应该是什么?
答案 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
等吗?