2
if( count( $_POST ) < 1 ) {
    // determine if this was a secure request - we use a non standard HTTPS port so the SERVER_HTTPS_PORT define should always be used in place of 443
    $protocol = $_SERVER['SERVER_PORT'] == SERVER_HTTPS_PORT ? 'https' : 'http';
    header( "HTTP/1.0 301 Moved Permanently" ); 
    header( "Status: 301" ); // this is for chrome compliance
    header( "Location: $protocol://".CLIENT_DOMAIN."{$_SERVER['REQUEST_URI']}" );       
    session_write_close();
    exit;
}

可以使用 .htaccess 规则重写此功能吗?

逻辑:

如果不是 POST 请求,则通过发出 301 标头和状态重定向到具有整个查询字符串的等效页面,同时保持协议。

4

3 回答 3

3

试试这个:

RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{SERVER_PORT}s ^443(s)|.*
RewriteRule ^foo/bar$ http%1://www.example.com%{REQUEST_URI} [L,R=301]

不是你只需要用443你的SERVER_HTTPS_PORT价值和www.example.com你的CLIENT_DOMAIN价值来代替。

于 2009-08-04T12:08:15.217 回答
2

这应该对您有用(替换www.google.com为您的CLIENT_DOMAIN)。

RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{REQUEST_METHOD} !^POST$ [NC]
RewriteRule ^(.*)$ http://www.google.com/$1 [L,QSA,R=301]
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_METHOD} !^POST$ [NC]
RewriteRule ^(.*)$ https://www.google.com/$1 [L,QSA,R=301]
于 2009-08-04T11:54:02.983 回答
0

查看 Apache 的mod_rewrite的文档,可能有一种方法,%{REQUEST_METHOD}RewriteCond条件中使用;像这样的东西可能会奏效:

RewriteCond %{REQUEST_METHOD} !=POST

当然,随后需要RewriteRule将所有内容重定向到非 POST 页面。

我现在无法进行测试,所以这可能并不完美,但这样的事情可能会奏效——或者,至少,引导你找到解决方案:

RewriteRule ^(.*)$ $1 [QSA,R=301,L]

这个想法是

  • 匹配一切
  • 重定向到匹配的内容
  • 保留查询字符串(QSA 标志)
  • 并使用 301 代码重定向
  • 并停在那里
于 2009-08-04T11:41:46.113 回答