如何使重写规则相对于.htaccess文件

目前我有一个这样的.htaccess文件。

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC] RewriteRule ^(.*)$ router.php [L,QSA] 

当网站文件位于networking服务器的document_root(即domain.com/abc.php – > <DOCUMENT_ROOT>/abc.php )时,它会生成。 但在我们目前的设置(这是不可改变的),这不能保证。 我们有时可以在.htaccess文件的文档根目录和文件夹之间有任意文件夹(即domain.com/something/abc.php – > <DOCUMENT_ROOT>/something/abc.php )。 唯一的问题是,第二个RewriteCond不再有效。 有没有办法dynamic检查path相对于.htaccess文件访问的path。

例如:

如果我有一个站点,其中domain.com/prefix/.htaccess文件的目录。

 NOT FORCED TO REWRITE -> domain.com/prefix/index.php FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php 

如果我有一个网站,其中domain.com/.htaccess文件的目录。

 NOT FORCED TO REWRITE -> domain.com/index.php FORCED TO REWRITE -> domain.com/rewrite/index.php 

有一个解决scheme,但并不简单。

使用RewriteMap

以下是我将要做的事情:

创build一个RewriteMap文件。 在这里看到更多的信息 。 这是一个非常简单的文本文件:首先,错误的URL 没有“/” ,然后一个空间 (至less),然后正确的URL,像这样:

 ok​ /folder1/ ok /folder2/ ok /folder3/ 

那么代码:

 RewriteMap myfoldermap \ dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*) # Now in '%1' there's the name of the folder # Don't touch the URL but... # ...check if it exists in the map file RewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}] # if the environment is neither empty or not found... RewriteCond %{E:FOLDERMAP} !^(notfound|)$ # this means we found something... # => apply the RewriteRule RewriteRule ^(.*)$ router.php [L,QSA] 

如果它不工作:阅读我通常的“两个提示”,并添加重写日志在你的问题。

两个提示:

如果您不在托pipe环境中(=如果它是您自己的服务器,并且您可以修改虚拟主机,而不仅仅是.htaccess文件),请尝试使用RewriteLog指令:它可以帮助您追踪这些问题:

 # Trace: # (!) file gets big quickly, remove in prod environments: RewriteLog "/web/logs/mywebsite.rewrite.log" RewriteLogLevel 9 RewriteEngine On 

我最喜欢的工具来检查正则expression式:

http://www.quanetic.com/Regex (不要忘了selectereg(POSIX)而不是preg(PCRE)!)

如果我确实理解了你(特别是我不知道你强迫重写的意思), RewriteBase就是为你准备的。

顺便说一句: 不要使用类似于domain.com的东西 🙂

强制重写意味着重写规则应该工作,即使请求的文件或目录存在?

如果是,只要避免创build文件/目录。

或者把它分成两个规则:

RewriteRule ^ /(总是|重写|这些| dirs)/ router.php [L]

RewriteCond%{REQUEST_FILENAME}!-f

RewriteCond%{REQUEST_FILENAME}!-d

RewriteRule ^(。*)$ router.php [L,QSA]