.htaccess 当来自另一个站点的响应为空时,如何设置头字段?

m3eecexj  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(104)

目前我们正在使用GTranslate来翻译我们的WordPress网站。
它有一个插件,可以将以下规则添加到.htaccess:

### BEGIN GTranslate config ###
RewriteRule ^(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)/(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)/(.*)$ /$1/$3 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)/(.*)$ /wp-content/plugins/gtranslate/url_addon/gtranslate.php?glang=$1&gurl=$2 [L,QSA]
RewriteRule ^(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)$ /$1/ [R=301,L]
### END GTranslate config ###

我检查了一下,似乎代码只是重写了多语言URL,如https://www.example.com/de/https://www.example.com/wp-content/plugins/gtranslate/url_addon/gtranslate.php?glang=de&gurl=https://www.example.com
然后gtranslate.php将联系GTranslate服务器进行翻译并返回翻译后的页面,下面是响应头:

但是,有时GTranslate服务器会返回空白页。在这种情况下,在响应头中,x-gt字段将全部丢失,如下所示:

由于我们的网站使用Cloudflare,我们希望在.htaccess中添加一个规则,以便在响应头不包含x-gt字段时不缓存翻译的页面,如下所示:

Header set CDN-Cache-Control "no-cache, must-revalidate, max-age=0" "xxx"
Header set Cloudflare-CDN-Cache-Control "no-cache, must-revalidate, max-age=0" "xxx"

但我不知道如何编写条件的情况下,当x-gt字段丢失

ilmyapht

ilmyapht1#

我不认为.htaccess file可以直接与传出的HTTP响应交互,特别是那些由外部服务器(如GTranslate)生成的响应。
这意味着你不能在.htaccess中根据GTranslate的响应头有条件地设置一个头。你需要一个服务器端代码。
您可以使用WordPress钩子来检查来自GTranslate的HTTP响应,并根据x-gt字段是否丢失有条件地设置CDN-Cache-ControlCloudflare-CDN-Cache-Control头。您可以使用wp_remote_getwp_remote_post来调用GTranslate服务。检查返回的HTTP响应的头,并使用header()有条件地设置该高速缓存控制头。

// Make a request to GTranslate service
$response = wp_remote_get('GTranslate API URL');

// Check if the request was successful
if (is_wp_error($response)) {
    // Handle error
    return;
}

// Retrieve the headers from the response
$headers = wp_remote_retrieve_headers($response);

// Check if the x-gt fields are missing
if (!isset($headers['x-gt-somefield'])) {
    // Conditionally set the headers for Cloudflare not to cache this response
    header('CDN-Cache-Control: no-cache, must-revalidate, max-age=0');
    header('Cloudflare-CDN-Cache-Control: no-cache, must-revalidate, max-age=0');
}

// Output the response body
$body = wp_remote_retrieve_body($response);
echo $body;

由于您将从PHP代码中完成此操作,因此您将完全控制HTTP响应,包括能够根据GTranslate响应的内容有条件地设置头。
请参阅“WordPress Filter Hooks“以将其包含到WordPress设置中。
这意味着这个解决方案旨在用于自定义WordPress钩子或主题的functions.php文件中,与GTranslate插件代码分开。
例如,您可以在WordPress本身和所有插件完全加载后使用wp_loaded action hook执行自定义代码:
functions.php文件中,您可以添加以下内容:

add_action('wp_loaded', 'my_custom_function');

function my_custom_function() {
    // Your custom logic here, including making HTTP requests, inspecting the responses, 
    // and conditionally setting headers
}

my_custom_function中,您可以使用wp_remote_getwp_remote_post函数与GTranslate API通信,然后检查响应头,如上所述。
1.原帖,如datanumen.com/outlook-repair并不需要联系GTranslate,但你的钩子函数会一直联系GTranslate服务器,这可能会减慢页面加载速度。
1.有可能当你的钩子函数得到一个有效的页面(带有x-gt字段)时,但是以后对gmarte.php的调用得到一个空白页面。
考虑到您的限制以及与GTranslate服务不一致行为的可能性,在插件代码gtranslate.php中包含直接修改的解决方案越来越有可能成为最佳方法。
如果您担心页面加载速度变慢以及对GTranslate服务器的不同调用之间可能存在不一致,您可以使用两步方法:
1.使用一个WordPress钩子,它只在你知道会涉及翻译的帖子上触发(如果在联系GTranslate之前有这样的信息)。在这个初始阶段,不要联系GTranslate服务器。相反,使用它来标记请求以进行进一步处理。
1.修改gtranslate.php以查找此标志。如果设置了此标志,请继续联系GTranslate服务,并根据x-gt字段的存在与否有条件地设置CDN-Cache-ControlCloudflare-CDN-Cache-Control标头。
关键是设置某种标志或条件,可以在不向GTranslate发出HTTP请求的情况下进行检查。该标志将在修改后的gtranslate.php文件中进行检查,以决定是否向GTranslate发出HTTP请求,并相应地设置该高速缓存控制头。

相关问题