我有以下RewriteRule,这样可以将转到domain.com/somepage/?page=3
的人重定向到domain.com/somepage/3/
:
RewriteCond %{THE_REQUEST} \?page=([0-9]+) [NC]
RewriteRule ^ /somepage/%1/? [R=301,L]
这是.htaccess
目录中的somepage
文件。
现在,这个工作很好......但这有点麻烦。我有十几个分页的页面,都在他们自己的目录中。我希望能够将.htaccess
文件复制到每个目录中,而不必担心编辑每个目录。例如,我还希望domain.com/someotherpage/?page=3
重定向到domain.com/someotherpage/3/
,但要执行此操作,我必须编辑相应的.htaccess
文件并将somepage
部分更改为{{ 1}}。
将整个站点复制到其他服务器时,也会出现问题。通常,该站点位于根目录中。但是,当我在本地运行它时,我将整个站点放在名为someotherpage
的文件夹中。所以现在我必须通过所有RewriteRules并将其从dev
更改为/somepage/%1/
。你可以想象,这非常乏味。
那么,有没有办法改变它,以便它重定向到的路径相对于/dev/somepage/%1
文件而不是服务器的根,这样我就可以重用相同的.htaccess
多次而不更改它,以便我也可以将整个网站移动到.htaccess
目录而无需更改任何内容?
感谢。
答案 0 :(得分:4)
您可以使用单独的规则动态捕获重写基础:
RewriteEngine On
RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=BASE:%2]
RewriteCond %{THE_REQUEST} \?page=(\d+) [NC]
RewriteRule ^ %{ENV:BASE}/%1/? [R=301,L]
<强>解释强>
$0
中使用从RewriteRule
抓取的RewriteCond
,因为mod_rewrite
实际向后处理规则集。它从RewriteRule
中的模式开始,如果匹配,则继续检查一个或多个RewriteCond
。RewriteCond
中看到的那样,LHS(测试字符串)可以使用反向引用变量,例如$1
,$2
或%1
,%2
等,但RHS方面即条件字符串无法使用这些$1
,{{1} }或$2
,%1
变量。%2
,\1
等表示。\2
首次捕获的群组中RewriteCond
。它将由内部反向引用`\ 1。([^#]*)
和RewriteBase
来标记此规则基本上是动态查找%{REQUEST_URI}
。 $0
的示例将为%{REQUEST_URI}
,同一示例URI的/directory/foobar.php
示例将为$0
。 foobar.php
正在为第二个被捕获的群组^([^#]*)#(.*)\1$
或%2
带来差异。在此处,它将使\2
或%2
填充值\2
,稍后在设置env变量/directory/
时使用该值%{ENV:BASE}
。