- Add complete dark mode system with theme context and toggle - Implement dark mode toggle component in navigation menu - Add client-side routing with SSR-safe signal handling - Fix language selector styling for better dark mode compatibility - Add documentation system with mdBook integration - Improve navigation menu with proper external/internal link handling - Add comprehensive project documentation and configuration - Enhance theme system with localStorage persistence - Fix arena panic issues during server-side rendering - Add proper TypeScript configuration and build optimizations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
5.7 KiB
Static File Serving in Rustelo
Rustelo provides built-in static file serving capabilities that allow you to serve images, PDFs, HTML files, and other static assets directly from the filesystem without any server-side processing.
Overview
Static files are served from the content/public directory and are accessible via the /public/ URL prefix. This feature is implemented using Axum's ServeDir service, which provides efficient static file serving with proper MIME type detection and caching headers.
Configuration
The static file serving is configured in server/src/main.rs:
.nest_service("/public", ServeDir::new("content/public"))
This configuration maps all requests to /public/* to files in the content/public directory.
Directory Structure
content/public/
├── images/ # Image files (PNG, JPG, SVG, etc.)
├── documents/ # PDF files, Word docs, etc.
├── styles/ # CSS stylesheets
├── scripts/ # JavaScript files
├── fonts/ # Web fonts
├── videos/ # Video files
├── downloads/ # Files for download
├── example.html # Example HTML file
└── README.md # Documentation
URL Mapping
| File Path | Accessible URL |
|---|---|
content/public/example.html |
/public/example.html |
content/public/images/logo.png |
/public/images/logo.png |
content/public/documents/manual.pdf |
/public/documents/manual.pdf |
content/public/styles/custom.css |
/public/styles/custom.css |
content/public/scripts/app.js |
/public/scripts/app.js |
Supported File Types
The server automatically detects and serves files with appropriate MIME types:
- HTML files (
.html,.htm) →text/html - CSS files (
.css) →text/css - JavaScript files (
.js) →application/javascript - Images (
.png,.jpg,.jpeg,.gif,.svg,.webp) →image/* - PDF documents (
.pdf) →application/pdf - Text files (
.txt,.md) →text/plain - JSON files (
.json) →application/json - XML files (
.xml) →application/xml
Usage Examples
1. Serving Images
Place images in content/public/images/ and reference them:
<img src="/public/images/logo.png" alt="Company Logo">
2. Including CSS Stylesheets
Add CSS files to content/public/styles/:
<link rel="stylesheet" href="/public/styles/custom.css">
3. Loading JavaScript Files
Include JavaScript files from content/public/scripts/:
<script src="/public/scripts/app.js"></script>
4. Downloadable Documents
Provide downloadable files:
<a href="/public/documents/user-manual.pdf" download>Download Manual</a>
Features
- Direct File Serving: Files are served exactly as stored, without processing
- MIME Type Detection: Automatic content-type headers based on file extension
- Performance: Efficient serving with proper caching headers
- Security: Files are served read-only with no server-side execution
- Flexibility: Supports any file type with proper MIME mapping
Security Considerations
- Public Access: All files in
content/publicare publicly accessible - No Authentication: Files are served without any access control
- No Processing: Files are served as-is, no server-side code execution
- File Permissions: Ensure proper file system permissions are set
Performance Notes
- Files are served directly by the Axum server for optimal performance
- Consider using a CDN for better global performance in production
- Large files should be optimized before placing in the public directory
- Browser caching headers are automatically set for static files
Example Files
The template includes example files to demonstrate the functionality:
/public/example.html- Complete HTML page with CSS and JavaScript/public/styles/custom.css- CSS stylesheet with utility classes/public/scripts/example.js- JavaScript file with interactive demos/public/README.md- Detailed documentation
Development vs Production
Development
- Files are served directly from the filesystem
- Changes are immediately visible without restart
- No additional caching beyond browser defaults
Production
- Consider using a reverse proxy (nginx) for better static file performance
- Implement CDN for global distribution
- Use compression (gzip/brotli) for better transfer speeds
- Set appropriate cache headers for different file types
Best Practices
- Organization: Group similar files in subdirectories
- Naming: Use descriptive, SEO-friendly filenames
- Optimization: Compress images and minify CSS/JS before deployment
- Security: Never store sensitive files in the public directory
- Maintenance: Remove unused files regularly to keep the directory clean
Troubleshooting
File Not Found (404)
- Verify the file exists in
content/public - Check the URL path matches the file path exactly
- Ensure proper file permissions (readable by the server)
Wrong MIME Type
- Check the file extension is recognized
- Verify the file content matches the expected type
- Ensure the file is not corrupted
Permission Denied
- Check file system permissions
- Verify the server process has read access to the directory
- Ensure the file is not locked by another process
Testing
You can test the static file serving by:
- Starting the server:
cargo leptos serve - Accessing the example file:
http://localhost:3000/public/example.html - Using the browser's developer tools to inspect network requests
- Running the JavaScript test functions in the browser console
The example JavaScript file provides test utilities accessible via StaticFileDemo.test() in the browser console.