仅在找不到文件时才重定向请求?

Div*_*ero 15 apache .htaccess mod-rewrite

我希望有一种方法可以用mod_rewrite和Apache做到这一点,但也许还有另一种方法可以考虑.

在我的网站上,我为客户端设置了重新设置的网站版本目录.如果是Web根目录/home/blah/www,那么客户端目录就是/home/blah/www/clients/abc.当您通过Web浏览器访问客户端目录时,我希望它在客户端目录中使用任何请求的文件(如果存在).否则,我希望它使用Web根目录中的文件.

例如,假设客户端不需要自己的客户端index.html.因此,一些代码将确定没有index.htmlin /home/blah/www/clients/abc并将改为使用/home/blah/www.请记住,我不想随时将客户端重定向到Web根目录,如果客户端目录没有指定自己的副本,我只想使用具有该名称的Web根目录.Web浏览器仍应指向/clients/abc该文件是存在还是存在于根目录中.同样,如果news.html客户端目录存在请求并且它确实存在,那么只需提供该文件而不是Web根目录news.html.用户的体验应该是无缝的.

我需要这个来处理任何文件名的请求.例如,如果我需要为.htaccess我可能想要重定向的每个文件添加一个新行,它就会失去目的,因为需要太多的维护,并且在给定大量文件的情况下很有可能出错.

在您的示例中,请指明您的代码是否位于客户端目录中的.htaccess文件或Web根目录中.Web root是首选.

Jer*_*y L 25

# 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 /archive
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d
RewriteRule (.*) /archive/$1 [L]
#
# Else rewrite requests for non-existent resources to /index.php
RewriteRule (.*) /index.php?q=$1 [L] 
Run Code Online (Sandbox Code Playgroud)

重写,如果文件不存在


Hap*_*ppy 10

这个怎么样?

# If requested resource exists as a file or directory go to it
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) - [L]

# Else rewrite requests for non-existent resources to /index.php
RewriteRule (.*) /index.php?q=$1 [L]
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 6

RewriteCond %{REQUEST_FILENAME} !-f
Run Code Online (Sandbox Code Playgroud)

  • 似乎太短了,无法做我想做的事。你能稍微解释一下逻辑吗?谢谢! (2认同)

Div*_*ero 5

我似乎对上面的每个例子至少有一个问题.%{DOCUMENT_ROOT}似乎在某些地方做错了,有些/人物似乎不见了.这是我的解决方案,它.htaccess位于Web根目录中.

而不是使用两个规则(一个用于找到clients /下的文件,一个用于未找到的文件),我需要检查的是所请求的文件(或目录)是否不存在.因为如果存在,则不需要进行任何更改,它只能使用客户端目录中提供的文件.这是我确定的代码:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L]
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!