使RewriteRule可移植/相对于.htaccess文件的目录

时间:2015-04-09 16:36:51

标签: apache .htaccess mod-rewrite redirect

我有以下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目录而无需更改任何内容?

感谢。

1 个答案:

答案 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变量。
  • 在RHS条件部分内,我们可以使用的只有后向引用内部反向引用,即我们在此条件下捕获的组本身。它们由%2\1等表示。
  • \2首次捕获的群组中RewriteCond。它将由内部反向引用`\ 1。
  • 表示
  • 您可以通过比较([^#]*)RewriteBase来标记此规则基本上是动态查找%{REQUEST_URI}$0的示例将为%{REQUEST_URI},同一示例URI的/directory/foobar.php示例将为$0foobar.php正在为第二个被捕获的群组^([^#]*)#(.*)\1$%2带来差异。在此处,它将使\2%2填充值\2,稍后在设置env变量/directory/时使用该值%{ENV:BASE}