mod_rewrite:将请求重定向到具有许多不同结构的子文件夹的子目录+重定向到index.php

时间:2012-02-17 14:32:27

标签: .htaccess url mod-rewrite url-rewriting

我需要创建一个以下规则来放入我的.htaccess

  1. 对于每个请求,我想在子文件夹子目录中执行文件/路径。
  2. 如果该文件不存在,那么我想将此请求转发给index.php
  3. 假设.htaccess位于http://domain/folder

    当用户打开网址http://domain/folder/Subfolder/xxx.html时 他应该从http://domain/folder/subdir/Subfolder/xxx.html

    收到档案

    所以这些规则必须考虑subir中有子文件夹这一事实。 (子文件夹的不同结构:-) 并且只有当subdir下的路径不存在时,才应将请求转发到index.php

    Plase help :)。

    ps这是我之前的一个后续问题。它完全不同,包括subdir中有子文件夹的事实。 - > mod_rewrite: How to search in local folder, subfolder and then redirect to index.php

3 个答案:

答案 0 :(得分:3)

为什么不简单地使用别名:

Alias /folder /subdir

并在您的404页面中重定向到index.php?它具有优势,404仍然被捕获到博客中。

答案 1 :(得分:3)

尝试将以下内容添加到您网站的.htaccess目录中的root/folder文件中。

RewriteEngine on
RewriteBase /folder

#capture the Subfolder/file.xx
RewriteCond %{REQUEST_URI} ^/[^/]+/([^/]+)$
#if the subdir/subfolder/file.xx exists
RewriteCond %{DOCUMENT_ROOT}/subdir/%1 -f  
#Serve this file
RewriteRule ^ /subdir/%1 [L,S=1]
#else send to index.php in root directory  
RewriteRule ^  /index.php [L]  

我假设您要将请求发送到根目录中的index.php。如果它位于文件夹目录中,请将最后一条规则更改为

RewriteRule ^  index.php [L]  

答案 2 :(得分:2)

这应该这样做:

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{REQUEST_URI} ([\w]+\.[\w]+)$ [NC]
RewriteCond %{DOCUMENT_ROOT}/%1 -f 
RewriteRule ^ /%1 [NC,L] 

RewriteCond %{DOCUMENT_ROOT}/subdir%{REQUEST_URI} -f
RewriteRule ^ /subdir%{REQUEST_URI} [L]

RewriteRule ^ /index.php [L]

稍有优化的更新。

RewriteEngine on
#RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^[^/]+\.[^/]+$ - [NC,L]

RewriteCond %{REQUEST_FILENAME} (.*/)([\w]+\.[\w]+)$ [NC]
RewriteCond %1subdir/%2 -f
RewriteRule ^ subdir/%2 [L]

RewriteRule ^ index.php [L]
  • 以上内容适用于anydirectory / subdir

更改日志:

  • RewriteBase评论了相对路径的使用。

  • 检查/file.ext(或是否在当前目录中)。 以下将检查当前目录中是否存在文件。

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^[^/]+\.[^/]+$ - [NC,L]

  •   

    RewriteCond%{DOCUMENT_ROOT} / subdir%{REQUEST_URI} -f

    捕获%1中的当前目录和%2中的file.ext