一个 .htaccess 文件中有多个 RewriteBase?

Posted

技术标签:

【中文标题】一个 .htaccess 文件中有多个 RewriteBase?【英文标题】:Many RewriteBase in one .htaccess file? 【发布时间】:2011-01-26 22:46:30 【问题描述】:

我在同一台服务器上有一个域和一个 wordpress 博客。现在我有一个问题(惊喜)。 wordpress 位于 /httpdocs/blog/ 并且域指向 /httpdocs/,我正在尝试将其重定向到 /httpdocs/domain/。但是,很明显,我在 Wordpress 中有永久链接。

这是我当前的 .htaccess:

RewriteEngine On

RewriteBase /blog/
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /blog/index.php [L]

RewriteBase /
RewriteCond %HTTP_HOST domain.com
RewriteCond %REQUEST_URI !^/domain
RewriteCond %REQUEST_URI !^/cgi-bin
RewriteRule ^(.*)$ domain/$1 [L]

但正如您已经推测的那样,这行不通。 Wordpress 的永久链接也影响到 /domain/,所以我的图片和其他 url 出错了。

有什么建议吗?可以这样使用 RewriteBase 吗?

【问题讨论】:

【参考方案1】:

当我试图找到类似问题的解决方案时,我来到了这篇文章。似乎可以有多个基础 URL,但重写后逻辑并没有停止。如果 URL 命中两个重写库,则所有重写都将运行。因此,最严格的重写基数应该放在文件的末尾。对于这个例子,它应该是:

RewriteEngine On

RewriteBase /
RewriteCond %HTTP_HOST domain.com
RewriteCond %REQUEST_URI !^/domain
RewriteCond %REQUEST_URI !^/cgi-bin
RewriteRule ^(.*)$ domain/$1 [L]

RewriteBase /blog/
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /blog/index.php [L]

注意到由于两个重写都在运行,因此如果重写相矛盾,您将需要退回到已接受的答案。

【讨论】:

【参考方案2】:

不,您只能有一个基本 URL。只需重写你的规则:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^blog/. /blog/index.php [L]

RewriteCond %HTTP_HOST =example.com
RewriteCond %REQUEST_URI !^/domain
RewriteCond %REQUEST_URI !^/cgi-bin
RewriteRule ^(.*)$ domain/$1 [L]

【讨论】:

似乎最后一个 RewriteBase 指令胜过整个 .htaccess 文件。 事实上,在问题中使用RewriteBase 背后的最初想法似乎无论如何都是错误的。不管RewriteBase 的值如何,您都需要将RewriteRule 模式写为^blog/.RewriteBase 不会影响与 pattern 匹配的 URI,它只会影响相对的 substitutions

以上是关于一个 .htaccess 文件中有多个 RewriteBase?的主要内容,如果未能解决你的问题,请参考以下文章

Letsencrypt和CakePHP应用程序的Htaccess重写文件

PHP & .htaccess:为多个目录添加文件

简单的htaccess base重写为子文件夹中的站点,链接与相对路径

用于Wordpress多站点的htaccess

Web 服务器配置

请求高手转换下伪静态 把httpd.ini转为 .htaccess