Apache 将站点上所有页面(包括子文件夹)的mod_重写为单个php页面

Apache 将站点上所有页面(包括子文件夹)的mod_重写为单个php页面,apache,mod-rewrite,Apache,Mod Rewrite,我正在将包含许多静态html页面的站点转换为由数据库驱动的站点。我的问题是,我不想丢失google已经索引的内容,所以我想重写通过php脚本发送的请求,该脚本查找数据库中内容的文件路径。我的理解是,修改最适合这个目的,不幸的是我从未使用过它,所以我有点迷茫 我所拥有的: www.domain.com/index.html www.domain.com/page.html?var=123&flag=true www.domain.com/folder/subfolder/ www.doma

我正在将包含许多静态html页面的站点转换为由数据库驱动的站点。我的问题是,我不想丢失google已经索引的内容,所以我想重写通过php脚本发送的请求,该脚本查找数据库中内容的文件路径。我的理解是,修改最适合这个目的,不幸的是我从未使用过它,所以我有点迷茫

我所拥有的:

www.domain.com/index.html
www.domain.com/page.html?var=123&flag=true
www.domain.com/folder/subfolder/
www.domain.com/folder/subfolder/index.html
www.domain.com/folder/subfolder/new/test.html
www.domain.com/folder/subfolder/new/test.html?var=123&flag=true
我想要的(我可能还需要对路径进行URL编码)(传递完整的uri也可以):

这是我的第一次尝试:

RewriteEngine On  # Turn on rewriting    
RewriteCond %{REQUEST_URI} .* # Do I even need this?    
^(.*)$ /index.php?page=$1
想法?提前感谢:)

编辑:

因此,我尝试实现Ragnar的解决方案,但当我使用“RewriteCond$1”或在最后一行包含“/”时,我不断收到500个错误。我已经设置了一个test.php文件,它将回显GET_u[“page”],因此我知道重写工作正常。到目前为止,我可以获得一些正确的输出(但仅当我不在root中时),例如:

RewriteEngine on
RewriteRule ^page/(.*)$ test.php?page=$1 [L]
如果我访问该页面,它将输出“test/subdirectory/page.html”(缺少我需要的查询字符串)。但是,如果我使用此示例:

RewriteEngine on
RewriteRule ^(.*)$ test.php?page=$1 [L]
如果我访问它,它只会输出'test.php',这完全令人困惑。想法

编辑#2:

看来我在这件事上做错了。我只是希望能够在我的php脚本页面中使用完整的uri。要实现我的目标,最终的工作解决方案如下:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test.php

然后在我的php脚本中,我可以使用$\u SERVER['REQUEST\u URI']来获取我需要的内容。我知道这应该比我尝试的更容易…

我建议您研究一下,它包含大量关于重写示例的信息

如果我没弄错的话,你应该可以用这样的东西

RewriteEngine on
RewriteCond $1 
RewriteRule ^(.*)$ index.php/?page=$1 [L]

这与你发布的代码非常相似。如果你想得到更好的信息,请具体说明你的问题。

没有必要写这么多行,这只会使事情复杂化

您只需在
中输入两行即可。htaccess

重新编写引擎打开
#重写规则-:ar1路径=相对。ar2如果是相对的,则表示要重写基。
重写规则^foo/bar/index\.php$/foo/bar/index.php
#..断言ar1取消匹配正确的url

PHP中的

您可以使用以下命令在PHP中输出rewriterule的第一个输入:

<?=$_SERVER['REQUEST_URI'];

电路中断和未设计的使用

断路器需要以下任一项:

  • arg2[重写规则]&rlhar;绝对的。和htaccess parentfolder&rlhar;根
  • arg2&rlhar;相对的。并且该文件夹不在arg2中
  • 那么当那个文件夹≠ 根,断路器需要arg2和rlhar;相对的。当arg2&rlhar;相对而言,断路器需要⎾那个文件夹&rlhar;不在arg2中⏋.

    假设我们需要断路器和位于解释型arg2中的htaccess parentfolder,因此我们通过rewritebase编辑arg2:

    重新编写引擎打开
    #重写规则-:ar1路径=相对。ar2如果是相对的,则表示要重写基。
    重写规则^bar/index.php
    #..电路中断,因此如果绝对,则断言ar2,否则,htaccess parentfolder=root,htaccess parentfolder不在解释的ar2中。
    重写基/foo
    #…必须是绝对的[开始]。允许走小路[如和]
    
    感谢您的回复,很高兴看到我走上了正确的道路。最后一行的urlencoding$1有什么提示吗?@veerman,请参阅。@veerman,只要它是透明重定向(即不是重定向到新域),您就不必费心传递
    $1
    。只需执行透明重定向,您就可以使用通常的方式从脚本中读取路径:
    echo$\u SERVER['REQUEST\u URI']
    。C我的答案。如果编辑#2是解决方案,你应该将其作为解决方案发布,然后在几个小时后检查。
    <?=$_SERVER['REQUEST_URI'];