一个 .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重写文件