-
-
Save refringe/6545132 to your computer and use it in GitHub Desktop.
| server { | |
| listen 80; | |
| listen [::]:80; | |
| server_name domain.com; | |
| autoindex off; | |
| index index.php index.html; | |
| root /srv/www/domain.com/public; | |
| access_log /srv/www/domain.com/logs/access.log; | |
| error_log /srv/www/domain.com/logs/error.log; | |
| location / { | |
| try_files $uri $uri/ $uri.php?$args; | |
| } | |
| location /l/ { | |
| rewrite ^/l/([a-zA-Z0-9/]+)$ /l.php?i=$1 last; | |
| } | |
| location /t/ { | |
| rewrite ^/t/([a-zA-Z0-9/]+)$ /t.php?i=$1 last; | |
| } | |
| location /w/ { | |
| rewrite ^/w/([a-zA-Z0-9/]+)$ /w.php?i=$1 last; | |
| } | |
| location /unsubscribe/ { | |
| rewrite ^/unsubscribe/(.*)$ /unsubscribe.php?i=$1 last; | |
| } | |
| location /subscribe/ { | |
| rewrite ^/subscribe/(.*)$ /subscribe.php?i=$1 last; | |
| } | |
| location ~ \.php$ { | |
| try_files $uri =404; | |
| fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| fastcgi_pass unix:/var/run/php5-fpm.sock; | |
| fastcgi_index index.php; | |
| include fastcgi_params; | |
| } | |
| location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { | |
| access_log off; | |
| log_not_found off; | |
| expires 30d; | |
| } | |
| } |
🛠 Fixing the Sendy /login Redirect Loop
If you get stuck in an infinite
/login?redirect=login?redirect=login...
loop in Sendy, here’s what worked for me:
1️⃣ Normalize the /login route in nginx
Add these rules inside your Sendy server block to strip extra redirect params and point directly to login.php:
location = /login {
if ($arg_redirect) { return 301 /login; } # strip any redirect param
return 302 /login.php;
}
location = /login/ { return 301 /login; }2️⃣ Seed the required DB tables
Sendy needs at least one user and one brand (apps entry) to operate.
USE sendy_db;
-- Create admin user
INSERT INTO login (name, email, password)
VALUES ('Admin','[email protected]', MD5('StrongPassword123'));
-- Create default brand
INSERT INTO apps (app_name, from_name, from_email, reply_to, currency, app_key)
VALUES ('Default Brand','Admin','[email protected]','[email protected]','USD','init-key');3️⃣ Fix PHP session permissions
If PHP can’t write sessions, login state won’t persist.
php -i | grep "session.save_path"
# Usually /var/lib/php/sessions
sudo chown -R www-data:www-data /var/lib/php/sessions
sudo chmod 1733 /var/lib/php/sessions
sudo systemctl restart php8.3-fpm4️⃣ Verify APP_PATH in config
In includes/config.php:
define('APP_PATH', 'https://sendy.redjuice.agency'); // exact domain, https, no trailing slash✅ After these changes, the login loop stopped and I could access Sendy normally.
🛠 Handling Pretty URLs in Sendy with nginx
If links like /logout or /settings download a .php file instead of loading the page, nginx is serving the file as static content instead of executing it with PHP-FPM.
Fix: Catch-all rewrite for extensionless URLs
This config snippet rewrites /route to /route.php if the file exists, otherwise falls back to index.php. It works for all routes, so you don’t need separate rules for /login, /logout, /settings, etc.
# Normal routing: serve files/dirs, else hand off to @extless
location / {
try_files $uri $uri/ @extless;
}
# Handle extensionless routes
location @extless {
if (-f $document_root$uri.php) {
rewrite ^ /$uri.php last; # internal rewrite → PHP-FPM
}
rewrite ^ /index.php?$args last; # fallback
}
# PHP handler
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # adjust PHP version if needed
}
# Sendy tracking rewrites (keep existing)
location ~ ^/(l|t|w|(un)?subscribe)/ {
rewrite ^/([^/]+)/(.*)$ /$1.php?i=$2 last;
}
Thanks for catching this!. Not sure how the files are served in nginx.
Moved it to a different folder.