如何使RewriteCond更改THE_REQUEST而不是REQUEST_METHOD

时间:2013-09-19 19:28:35

标签: php .htaccess mod-rewrite

我从互联网上获得了这条重写规则:

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

规则运行良好,但现在当我尝试发送POST消息时,此规则也会重写GET方法。这是我的表格:

<form action="check.php" method="post">
<input type="text" name="email" id="email"/>
<input type='submit' value='check'>
</form>

这是我从服务器获得的(var_dump($ _ SERVER))

["REQUEST_METHOD"]=>
string(3) "GET"

我对重写规则并不熟悉。你能告诉我如何修复它以便它仍处理php文件扩展名但不会触及REQUEST_METHOD部分(从POST到GET)?

谢谢。

更新完整规则:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /


# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [L,NC] #[R,L,NC]


## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f [NC]
RewriteRule ^ %{REQUEST_URI}.php [L]

2 个答案:

答案 0 :(得分:2)

这就是.htaccess应该是这样的:

Options +FollowSymLinks -MultiViews 

RewriteEngine On
RewriteBase /

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

你永远不应该在.htaccess的条件和规则的相同行上使用评论:

RewriteRule ^ %1 [L,NC] #[R,L,NC]

因为它会使.htaccess无法正常工作,所以评论应始终在新行上。

这就是您的表单的样子:

<form action="http://domain.com/check" method="post">
<input type="text" name="email" id="email"/>
<input type="submit" value="check">
</form>

这应该正确地返回您想要作为POST方法的值。

array(1) { ["email"]=> string(4) "text you typed on the input box" } 

答案 1 :(得分:0)

您正在进行重定向 [R] - 因此您要发布到只是转储POSTed数据并重定向请求(HTTP GET)的位置。该帖子应该指向/ dir / foo,它可以传递给/dir/foo.php,但你是最新的.htaccess不允许这样做。

您的表单应如下所示:

<form action="/check" method="post">
      <input type="text" name="email" id="email"/>
      <input type='submit' value='check'>
</form>

以下是.php文件的内部路由示例。

 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-f  # As long as it's not a file
 RewriteCond %{REQUEST_FILENAME} !-d  # As long as it's not a directory
 RewriteRule (.*) $1.php [L,QSA]

希望指出你正确的方向。