.htaccess重定向到子目录,如果不存在

时间:2015-09-08 17:55:15

标签: apache .htaccess redirect

我试图从子目录中加载文件,如果它们不存在于根目录中,并且只有在子目录中确实存在时才会这样做。

RewriteEngine On

# If requested resource exists as a file or directory, skip next two rules
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule (.*) - [S=2]

# Requested resource does not exist, do rewrite if it exists in /pages
RewriteCond %{DOCUMENT_ROOT}/pages/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/pages/$1 -d
RewriteRule (.*) /pages/$1 [L]

# Else rewrite requests for non-existent resources to /index.php
# Disabled to see when the files fail to load
#RewriteRule (.*) /index.php?q=$1 [L]

# Remove file extention
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

# Error Documents
ErrorDocument 400 /400.shtml
ErrorDocument 404 /404.shtml
ErrorDocument 500 /500.shtml

以下网址

以下不起作用

有谁知道我在这种情况下做错了什么?此外,我确定它与我如何解决丢失的文件重定向有关,但是当服务器返回404错误时,404.shtml页面无法加载。

1 个答案:

答案 0 :(得分:2)

原因是您在删除其扩展名时检查文件是否存在。当然,它不会存在。此外,您重新使用扩展程序的规则也不知道还要检查/ pages /目录。

尝试类似的事情:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/pages/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/pages/$1 -d
RewriteRule (.*) /pages/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.html -f
RewriteRule ^(.*)$ /$1.html [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)$ /$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/pages/$1\.html -f
RewriteRule ^(.*)$ /pages/$1.html [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/pages/$1\.php -f
RewriteRule ^(.*)$ /pages/$1.php [L]