如何让子目录页面调用根index.php渲染且保留原URL?
Got it, let's fix this properly. The goal is to make sure any request to /subdir/fr/... or /subdir/en/... gets handled by your root /index.php while keeping the original URL intact—no redirects, just internal routing. Here's how to do it:
Step 1: Set Up URL Rewriting with .htaccess (Apache Servers)
First, create or edit the .htaccess file in your website's root directory. This will tell Apache to send all subdir requests to index.php without changing the URL.
RewriteEngine On # Route all requests under /subdir/ to index.php # The [L] flag stops further rewrite rules from running RewriteRule ^subdir/(.*)$ /index.php [L]
Notes for Apache:
- Make sure
mod_rewriteis enabled on your server (most hosting providers have this on by default, but you can check viaphpinfo()if unsure). - If your site is in a subfolder (not the server root), adjust the rewrite rule paths accordingly (e.g., replace
/index.phpwith/your-site-folder/index.php).
Step 2: Update Your index.php Logic
Your existing code targets /subdir_fr/, which doesn't match your actual directory structure (/subdir/fr/). Let's rewrite that section to handle both French and English subdirectories safely:
// Check if the request is coming from the /subdir/ path if (strpos($_SERVER['REQUEST_URI'], '/subdir/') === 0) { // Extract the path after /subdir/ (e.g., "fr/mypage1.html") $relativePath = ltrim($_SERVER['REQUEST_URI'], '/subdir/'); // Build the full file path on the server $fullFilePath = $_SERVER['DOCUMENT_ROOT'] . '/subdir/' . $relativePath; // Critical security check: Prevent path traversal attacks // Make sure the file exists and is within the /subdir/ directory $safeSubdirPath = realpath($_SERVER['DOCUMENT_ROOT'] . '/subdir/'); $safeFilePath = realpath($fullFilePath); if ($safeFilePath && strpos($safeFilePath, $safeSubdirPath) === 0) { require_once($safeFilePath); } else { // Handle missing files or malicious requests with a 404 http_response_code(404); echo "Page not found"; } }
Key Improvements:
- Security: The
realpathchecks prevent attackers from accessing files outside the/subdir/directory (e.g.,../../etc/passwd). Never skip this step! - Flexibility: This code works for any subdirectory under
/subdir/(not justfranden), so you can add more languages later without changing the logic. - Error Handling: Properly returns a 404 status code if the requested file doesn't exist, which is better for SEO and user experience.
Step 3: Nginx Alternative (If You're Using Nginx)
If your server runs Nginx instead of Apache, update your site's configuration block to include this location rule:
location /subdir/ { # Send all requests to index.php while preserving query strings try_files $uri $uri/ /index.php$is_args$args; }
After making this change, reload Nginx to apply the new configuration.
Testing It Out
Once you've set up the rewrite rules and updated your PHP code:
- Visit
example.com/subdir/fr/mypage1.html - The URL stays the same, but your root
index.phpwill handle the request and include the correct file.
内容的提问来源于stack exchange,提问作者user1851673

