நிலையான தளங்கள் சர்வர்-பக்க குறியீட்டை இயக்காது, ஆனால் தொடர்பு படிவத்திற்கு இன்னும் அது தேவை. SSH வழியாக பகிரப்பட்ட ஹோஸ்டிங்கில் நிறுவப்பட்ட Hugo தளத்தில் PHP/PHPMailer தொடர்பு படிவத்தை நான் எவ்வாறு இணைத்தேன் — மற்றும் வழியில் என்ன தவறாக நடந்தது என்பது இங்கே.
அமைப்பு
தளம் Hugo வில் உருவாக்கப்பட்டுள்ளது மற்றும் வெளியீடு cPanel பகிரப்பட்ட ஹோஸ்டுக்கு rsync செய்யப்படுகிறது. PHP சர்வர்-பக்கத்தில் கிடைக்கிறது, எனவே தொடர்பு படிவம் Hugo வெளியீட்டுடன் public_html/ இல் இருக்கும் contact.php கோப்பிற்கு post செய்கிறது.
PHPMailer SMTP அனுப்புதலைக் கையாளுகிறது. நூலகத்தை நேரடியாக vendor செய்கிறேன் (Composer இல்லை) — கோப்புகள் static/vendor/phpmailer/ இல் உள்ளன மற்றும் Hugo அவற்றை உருவாக்க நேரத்தில் public/ க்கு நகலெடுக்கிறது.
நற்சான்றிதழ்களை Git இலிருந்து வெளியே வைத்தல்
SMTP நற்சான்றிதழ்கள் ஒருபோதும் commit செய்யப்படக்கூடாது. அணுகுமுறை:
contact.phprequire __DIR__ . '/mail-config.php';ஐ அழைக்கிறதுmail-config.phpமாறிலிகளை (SMTP_HOST,SMTP_USER,SMTP_PASS, முதலியன) வரையறுக்கிறதுstatic/mail-config.php.gitignoreஇல் சேர்க்கப்பட்டுள்ளதுstatic/mail-config.example.phpகுறிப்பு வார்ப்புருவாக commit செய்யப்பட்டுள்ளது
சர்வரில், mail-config.php க்கு chmod 600 — செயல்முறை உரிமையாளரால் மட்டுமே படிக்கக்கூடியது.
SSH வழியாக நிறுவல்
நிறுவல் கட்டளை:
hugo && rsync -avz --exclude='mail-config.php' \
-e "ssh -p 7822" \
public/ user@ftp.example.com:~/public_html/ \
&& ssh -p 7822 user@ftp.example.com \
"chmod 600 ~/public_html/mail-config.php"
முக்கிய புள்ளிகள்:
--exclude='mail-config.php'நேரடி நற்சான்றிதழ் கோப்பை rsync மேலெழுதுவதைத் தடுக்கிறதுchmod 600ஒவ்வொரு நிறுவலுக்குப் பின்னும் பாதுகாப்பாக மீண்டும் பயன்படுத்தப்படுகிறது
SMTP பிழைத்திருத்தம்
mail-config.php இல் உள்ள நற்சான்றிதழ்கள் ஆரம்பத்தில் தவறாக இருந்தன. கண்டறிய, சர்வரில் நேரடியாக SMTPDebug = 2 உடன் PHPMailer ஐ இயக்கும் சோதனை ஸ்கிரிப்டை பதிவேற்றினேன்:
scp -P 7822 smtp_test.php user@ftp.example.com:/tmp/
ssh -p 7822 user@ftp.example.com "php /tmp/smtp_test.php; rm /tmp/smtp_test.php"
பிழைத்திருத்த வெளியீடு உடனடியாக 535 Incorrect authentication data ஐக் காட்டியது — இது நற்சான்றிதழ்கள் என்பதை உறுதிப்படுத்தியது, ஃபயர்வால் அல்லது TLS சிக்கல் அல்ல. சரிசெய்த பின், வெளியீடு 235 Authentication succeeded ஐக் காட்டியது மற்றும் அஞ்சல் வழங்கப்பட்டது.
கோப்பு அனுமதிகள்
பகிரப்பட்ட ஹோஸ்டிங் கோப்பு அனுமதிகள் குறித்து கடுமையானது. விதிகள்:
| வகை | அனுமதி |
|---|---|
| அடைவுகள் | 755 |
| கோப்புகள் | 644 |
| முக்கிய கட்டமைப்பு | 600 |
Hugo static/ இலிருந்து கோப்புகளை அவற்றின் மூல அனுமதிகளை பாதுகாத்து நகலெடுக்கிறது. மூல கோப்புகளுக்கு தவறான முறைகள் இருந்தால், அவை சர்வரில் தவறாக இருக்கும். மூலத்தில் ஒருமுறை சரிசெய்யுங்கள்:
find static -type f -exec chmod 644 {} \;
find static -type d -exec chmod 755 {} \;
அதன் பிறகு, ஒவ்வொரு hugo உருவாக்கமும் சரியான அனுமதிகளுடன் வெளியீட்டை உருவாக்குகிறது மற்றும் rsync அதை சுத்தமாக பரப்புகிறது — எதிர்கால நிறுவல்களில் சர்வர்-பக்க திருத்தங்கள் தேவையில்லை.
கைமுறையாக கவனிக்க வேண்டிய இரண்டு கோப்புகள்:
.htaccessநேரடியாகpublic_html/இல் உள்ளது, Hugo ஆல் நிர்வகிக்கப்படவில்லை. ஒருமுறை அமைக்கவும்:chmod 644 .htaccess. இந்த கோப்பைப் படிக்க முடியாவிட்டால் Apache எந்த பக்கத்தையும் வழங்க முடியாது.mail-config.phprsync இலிருந்து விலக்கப்பட்டுள்ளது மற்றும்chmod 600ஆக இருக்க வேண்டும் — நிறுவல் கட்டளை இதைக் கையாளுகிறது.
தொடர்பு படிவம்: வெற்று POST க்கு பதிலாக Fetch
அசல் படிவம் வெற்று HTML <form action="..."> POST ஐ பயன்படுத்தியது. இது வேலை செய்யும் ஆனால் சரிபார்ப்பு தோல்வியடையும்போது உலாவி பக்கத்தில் மூல JSON ஐ காட்டுகிறது — பயனர் {"ok":false,"errors":[...]} ஐ பார்த்து Back அழுத்த வேண்டும்.
மேம்படுத்தப்பட்ட பதிப்பு fetch மூலம் submit ஐ இடைமறிக்கிறது:
- கிளையன்ட்-பக்க சரிபார்ப்பு முதலில் இயங்குகிறது — வெளிப்படையான பிழைகள் ஒருபோதும் சர்வரை அடையாது
- சர்வர் பிழைகள் inline புல ஹைலைட்களுக்கு மீண்டும் வரைபடமாக்கப்படுகின்றன
- வெற்றியில், JS
/{lang}/contact/?sent=1க்கு திருப்பி விடுகிறது — சரியான நன்றி பக்கம்
Hugo வார்ப்புருக்களில் ஒரு சிக்கல்: | jsonify வடிகட்டி ஒரு சரம் மதிப்பை JSON மேற்கோள்களில் மூடுகிறது. /contact.php போன்ற param இல் இது "/contact.php" ஐ உருவாக்குகிறது — சரியானது. ஆனால் இருமுறை பயன்படுத்தினால் "\"/contact.php\"" ஐ உருவாக்குகிறது, இது நேரடி மேற்கோள் எழுத்துகளைக் கொண்ட URL ஆகும். fetch அமைதியாக தோல்வியடைகிறது. அதற்கு பதிலாக வெற்று interpolation ஐ பயன்படுத்தவும்:
var action = "{{ .Site.Params.contactFormAction }}";
மேலும் contact.php இன் மேலே ini_set('display_errors', '0'); ஐ சேர்க்கவும். PHP எச்சரிக்கைகள் இயக்கப்பட்டிருந்தால், அவை JSON பதில் உடலுக்கு முன்னால் சேர்க்கப்படுகின்றன, உலாவியில் JSON.parse ஐ உடைக்கின்றன.
சுருக்கம்
| சிக்கல் | தீர்வு |
|---|---|
| Git இல் நற்சான்றிதழ்கள் | தனி mail-config.php, gitignore செய்யப்பட்டது, chmod 600 |
| SMTP அங்கீகார தோல்வி | சர்வரில் SMTPDebug = 2 உடன் சோதனை ஸ்கிரிப்ட் |
| அனைத்து பக்கங்களிலும் 403 | .htaccess 700 ஆக இருந்தது — 644 ஆக மாற்றப்பட்டது |
| படங்களில் 403 | static/ மூல கோப்புகளுக்கு தவறான அனுமதிகள் இருந்தன — மூலத்தில் சரிசெய்யப்பட்டது |
| உலாவியில் JSON parse பிழை | display_errors=1 PHP எச்சரிக்கைகளை பதில் உடலில் கசிய வைத்தது |
| submit இல் “ஏதோ தவறு ஏற்பட்டது” | ` |