让.htaccess RewriteRule重定向到"当前目录"中的脚本(而不是显式路径)

She*_*man 6 apache .htaccess mod-rewrite redirect

我在.htaccess中使用RewriteRule将任何不是现有文件的内容重定向到"cms.php"文件,该文件动态处理任何请求(或者在适当时输出一些错误消息).

这是我在.htaccess中所做的事情:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /cms.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

奇迹般有效.

但是,出于开发目的,我还想在我的本地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本身所在的位置

Jon*_*Lin 19

通常,您只需将一个RewriteBase目录设置为开发目录,并保留规则目标的前导斜杠:

RewriteEngine On
RewriteBase /subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ cms.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

但是如果这还不够好,并且你希望能够随意移动htaccess文件而不必一直改变基数,你可以尝试通过检测任意基数做一些疯狂的事情:

RewriteCond %{ENV:URI} ^$
RewriteRule ^(.*)$ - [ENV=URI:$1]

RewriteCond %{ENV:BASE} ^$
RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$
RewriteRule ^ - [ENV=BASE:%2]
Run Code Online (Sandbox Code Playgroud)

在你的htaccess文件的最顶层,然后使用BASEenvirontment变量:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{ENV:BASE}cms.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)