【问题标题】:Let .htaccess RewriteRule redirect to a script "in current dir" (instead of an explicit path)让 .htaccess RewriteRule 重定向到“当前目录”中的脚本(而不是显式路径)
【发布时间】:2014-01-28 10:10:57
【问题描述】:

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

这是我在 .htaccess 中所做的:

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

像魅力一样工作。

但是,出于开发目的,我还想在我的本地 XAMPP 系统上托管相同的站点。在我实际的实时网络服务器上,cms.php 就在 de 文档根文件夹中,因此我可以在那里使用 /cms.php。但是在我的本地开发机器上,该站点位于某个子目录中,即 /cms.php 不是正确的路径。

我还尝试了“cms.php”(前面没有 /)以及“./cms.php”(希望“.”表示当前目录),但无济于事。只有当我在 RewriteRule 中明确指定 /the/correct/subdir/cms.php 时,它才能正常工作,但显然这仅在开发机器上有效,在我的实时网络服务器上无效。

我能否以某种方式使用智能路径或 mod_rewrite 变量或其他东西,以便 .htaccess 了解它需要重定向到我的 cms.php 文件在与 .htaccess 本身所在的目录相同的目录中

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect


    【解决方案1】:

    通常,您只需将 RewriteBase 设置为 dev 目录,然后将前导斜杠从规则的目标中移除:

    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]
    

    【讨论】:

    • 嘿,谢谢,这似乎是一种复杂的方法,但我真的不知道你在做什么 :) 你能解释一下这是如何工作的吗?
    • @SheldonPinkman 对于第一个选项,您在 RewriteBase 中硬编码路径,对于第二个选项,您通过从中删除相对 URI 从 %{REQUEST_URI} 中提取基础(存储在%{ENV:URI} 变量中)。然后你可以使用这个基地作为%{ENV:BASE}
    • 哇,我不知道这么复杂的 RewriteRules。非常感谢!奇迹般有效。从来不知道“RewriteRule (condition) - [statement]”实际上并没有重定向任何东西,而只是执行语句。使用 URI 环境 var 构造(仅获取与当前目录相关的部分)然后从 REQUEST_URI 中“减去”它是非常聪明的。尊敬的先生!
    • 乔恩,一如既往的好答案。您能否参考可以更深入地解释extracting the base from the %{REQUEST_URI} by removing the relative URI from it (stored in the %{ENV:URI} variable). 的资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2018-04-26
    • 2013-09-19
    • 2010-10-05
    • 2016-07-18
    相关资源
    最近更新 更多