Laravel 11部署cPanel后西里尔域名无法正常传递问题排查
西里尔域名在cPanel部署后无法传递的问题解决
核心原因
问题出在URL编码与服务器解码不匹配:
- 直接将西里尔等非ASCII字符拼接在GET请求的URL参数中,虽然浏览器会自动编码,但cPanel环境下的PHP默认配置可能无法正确解码这些字符,导致
$request->input('domain')获取到空值。 - 英文域名无问题是因为ASCII字符不需要额外编码,服务器能正常解析。
解决办法
方法1:前端手动编码GET参数
修改JavaScript中的fetch请求,用encodeURIComponent对域名进行URL编码,确保特殊字符被转换为服务器可识别的格式:
document.getElementById('idn-form').addEventListener('submit', function(event) { event.preventDefault(); const domain = document.querySelector('#idn-form input[name="domain"]').value; const submitButton = document.getElementById('idn-submit'); submitButton.disabled = true; // 手动编码域名参数 fetch(`/idn?domain=${encodeURIComponent(domain)}`) .then(response => response.json()) .then(data => { const resultDiv = document.getElementById('idn-result'); resultDiv.innerHTML = `<p class="text-[#312E81] text-md font-semibold px-4 py-2 rounded-lg">${data.output}</p>`; document.getElementById('copy-button').classList.remove('hidden'); submitButton.disabled = false; }) .catch(error => { console.error('Error:', error); document.getElementById('idn-result').innerHTML = `<p class="text-red-500">An error occurred. Please try again later.</p>`; submitButton.disabled = false; }); });
方法2:改用POST请求(推荐)
GET请求对特殊字符的处理容易受服务器配置影响,改用POST请求传递数据更稳定:
1. 修改前端JavaScript
document.getElementById('idn-form').addEventListener('submit', function(event) { event.preventDefault(); const domain = document.querySelector('#idn-form input[name="domain"]').value; const submitButton = document.getElementById('idn-submit'); submitButton.disabled = true; fetch('/idn', { method: 'POST', headers: { 'Content-Type': 'application/json', // 确保携带Laravel的CSRF令牌 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content }, body: JSON.stringify({ domain: domain }) }) .then(response => response.json()) .then(data => { const resultDiv = document.getElementById('idn-result'); resultDiv.innerHTML = `<p class="text-[#312E81] text-md font-semibold px-4 py-2 rounded-lg">${data.output}</p>`; document.getElementById('copy-button').classList.remove('hidden'); submitButton.disabled = false; }) .catch(error => { console.error('Error:', error); document.getElementById('idn-result').innerHTML = `<p class="text-red-500">An error occurred. Please try again later.</p>`; submitButton.disabled = false; }); });
2. 修改Laravel路由
将原GET路由改为POST:
// routes/web.php use App\Http\Controllers\IDNController; Route::post('/idn', [IDNController::class, 'convert']);
3. 控制器优化(增加空值判断)
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Algo26\IdnaConvert\ToIdn; class IDNController extends Controller { public function convert(Request $request) { $domain = $request->input('domain'); // 增加空值判断,避免触发类型错误 if (empty($domain)) { return response()->json(['error' => 'Domain parameter is required'], 400); } $idn = new ToIdn(); $output = $idn->convert($domain); return response()->json(['output' => $output]); } }
额外配置检查(cPanel环境)
- 确保PHP默认字符集为UTF-8:
在cPanel的「PHP选项」中设置default_charset为UTF-8,或在项目根目录的.htaccess中添加:AddDefaultCharset UTF-8 - 启用mbstring扩展:
处理多字节字符(如西里尔文)需要mbstring扩展,在cPanel的「PHP扩展」中找到并启用它。
内容的提问来源于stack exchange,提问作者Ermuun
相关产品推荐
相关产品推荐

