You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境)

  1. 确保PHP默认字符集为UTF-8:
    在cPanel的「PHP选项」中设置default_charset为UTF-8,或在项目根目录的.htaccess中添加:
    AddDefaultCharset UTF-8
    
  2. 启用mbstring扩展:
    处理多字节字符(如西里尔文)需要mbstring扩展,在cPanel的「PHP扩展」中找到并启用它。

内容的提问来源于stack exchange,提问作者Ermuun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:14:53