2

I got this rewrite rule from the internet:

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

The rule works well, but now when I try to send a POST message, this rule will rewrite also the method to GET. This is my form:

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

This is what I got from the server (var_dump($_SERVER))

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

I am not really familiar with rewrite rules. Could you tell me how to fix it so that it still process php file extensions but wont touch the REQUEST_METHOD part (from POST to GET)?

Thank you.

UPDATE FULL RULE:

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.php に渡すことができる /dir/foo を指す必要がありますが、現在の .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 に答える