目前我有一个这样的.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]