2

我从互联网上得到了这个重写规则:

# 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]
4

2 回答 2

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" } 
于 2013-09-19T20:22:26.257 回答
0

您正在执行重定向[R] - 因此您正在发布到一个仅转储 POST 数据并重定向请求(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]

希望这会为您指明正确的方向。

于 2013-09-19T19:51:02.013 回答