# Environment-Aware URL Configuration
This document explains how analytics and SEO URLs adapt to different deployment environments.
## Overview
The Fellowship Quest List uses environment-aware URLs in critical files:
- **`index.html`**: Meta tags (canonical, og:url, og:image, twitter:image)
- **`sitemap.xml`**: All routes and API endpoints
This ensures that regardless of whether you're deploying to:
- Development: `http://localhost:5173`
- Staging: `https://lotr-staging.testingfantasy.com`
- Production: `https://lotr-prod.testingfantasy.com`
The URLs in these files are always correct.
## Environment Variables
### Primary Variable
`VITE_APP_SITE_URL` - The full site URL without trailing slash
- Example: `https://lotr-prod.testingfantasy.com`
- Example: `https://lotr-staging.testingfantasy.com`
- Example: `http://localhost:5173`
## How It Works
### For `index.html`
URLs are set dynamically at **runtime** using JavaScript:
1. Base URLs in HTML use placeholders: `%VITE_APP_SITE_URL%`
2. At page load, JavaScript reads `window.location.origin`
3. Dynamic updates to `` and `` tags ensure they reflect the actual deployment URL
4. This works for all deployment scenarios without rebuilding
### For `sitemap.xml`
URLs are substituted **at build time**:
1. Source file uses placeholders: `%VITE_APP_SITE_URL%`
2. Build script replaces placeholders with actual environment URL
3. Final `sitemap.xml` has concrete URLs for search engines
## Setup Instructions
### Development
```bash
cd sut/frontend
# Run dev server (uses http://localhost:5173 automatically)
npm run dev
```
### Build for Deployment
```bash
cd sut/frontend
# Set the environment-specific URL
export VITE_APP_SITE_URL="https://lotr-prod.testingfantasy.com"
# Build the application
npm run build
# Run setup script to update XML files with correct URLs
node scripts/setup-env-urls.js
```
### Docker Deployment
In your Dockerfile:
```dockerfile
ARG SITE_URL=https://lotr-prod.testingfantasy.com
# ... build steps ...
# Setup environment-aware URLs
ENV VITE_APP_SITE_URL=${SITE_URL}
RUN cd sut/frontend && node scripts/setup-env-urls.js
```
### CI/CD Pipeline
Example GitHub Actions:
```yaml
- name: Setup environment-aware URLs
env:
VITE_APP_SITE_URL: ${{ secrets.SITE_URL }}
run: |
cd sut/frontend
node scripts/setup-env-urls.js
```
## File Examples
### index.html (Runtime Dynamic)
```html
```
### sitemap.xml (Build-time Substitution)
```xml
%VITE_APP_SITE_URL%/loginhttps://lotr-prod.testingfantasy.com/login
```
## Testing URLs
### Verify index.html Dynamic URLs
```bash
# Open browser DevTools and check the Console when page loads
# Meta tags should update to match your current URL
# Example: If accessed at https://mysite.com
# - og:url should be "https://mysite.com/"
# - canonical should be "https://mysite.com/"
```
### Verify sitemap.xml
```bash
# Download sitemap.xml and check the URLs
curl https://lotr-prod.testingfantasy.com/sitemap.xml | head -20
# All entries should use the correct domain
```
## Benefits
✅ **Single codebase** - Deploy to any environment without code changes
✅ **Search engines** - Correct canonical URLs prevent duplicate content penalties
✅ **Social media** - Correct og: tags for rich previews on any domain
✅ **Analytics** - Proper tracking in GA regardless of deployment URL
✅ **No rebuilds** - index.html works without rebuild for different domains
## Troubleshooting
### URLs not updating in sitemap.xml
- Ensure `VITE_APP_SITE_URL` is set before building
- Run `node scripts/setup-env-urls.js` after build
- Check that `public/sitemap.xml` contains your domain, not `%VITE_APP_SITE_URL%`
### Meta tags not updating in index.html
- Open browser DevTools (F12)
- Go to Elements/Inspector and check `` etc.
- Verify JavaScript ran: check Console for any errors
- URL should match `window.location.origin`
### Staging environment has wrong URLs
- Verify `VITE_APP_SITE_URL` environment variable is set
- Run setup script before deploying
- Check that sitemap.xml contains staging URL, not production
## References
- [Google Canonical URLs](https://developers.google.com/search/docs/beginner/seo-starter-guide#declare-the-canonical-version-of-a-page)
- [Open Graph Protocol](https://ogp.me/)
- [Sitemap Protocol](https://www.sitemaps.org/protocol.html)