我在.htaccess中使用RewriteRule将任何不是现有文件的重定向到“cms.php”文件,该文件动态处理任何请求(或者在适当时输出一些错误消息) )。
这是我在.htaccess中所做的事情:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /cms.php [L,QSA]
像魅力一样工作。
但是,出于开发目的,我想在我的本地XAMPP系统上托管相同的站点。在我的实际网络服务器上,cms.php位于de document根文件夹中,因此我可以在那里使用/cms.php。但是在我的本地开发机器上,这个站点位于某个子目录中,即/cms.php不是正确的路径。
我也试过“cms.php”(没有/在它前面)以及“./cms.php”(希望“。”表示当前目录)但无济于事。只有当我在RewriteRule中明确指定/the/correct/subdir/cms.php时,它才能正常工作,但显然这只在开发机器上有效,而不在我的实时网络服务器上。
我可以以某种方式使用智能路径或mod_rewrite变量或其他东西,以便.htaccess知道它需要重定向到我的cms.php文件与.htaccess本身所在的同一目录吗? / p>
答案 0 :(得分:19)
通常情况下,您只需将RewriteBase
设置为开发目录,并从规则的目标中删除前导斜杠:
RewriteEngine On
RewriteBase /subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ cms.php [L,QSA]
但是如果这还不够好,并且你希望能够随意移动htaccess文件而不必一直改变基数,你可以尝试通过检测任意基数来做一些疯狂的事情:
RewriteCond %{ENV:URI} ^$
RewriteRule ^(.*)$ - [ENV=URI:$1]
RewriteCond %{ENV:BASE} ^$
RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$
RewriteRule ^ - [ENV=BASE:%2]
位于htaccess文件的最顶层,然后使用BASE
环境变量:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{ENV:BASE}cms.php [L,QSA]