.htaccess-重定向所有URL+;指向index.php的现有目录

.htaccess-重定向所有URL+;指向index.php的现有目录,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,我需要能够将目录中的所有URL重定向到目录中的index.php文件。与我找到的所有其他答案不同,这包括现有目录和现有文件。我使用带有.htaccess文件的Apache来实现这一点。到目前为止,我的.htaccess文件如下所示: <IfModule mod_rewrite.c> RewriteEngine On RewriteRule /sub/directory/index\.php - [L] RewriteRule - /sub/directory/index\.php &

我需要能够将目录中的所有URL重定向到目录中的index.php文件。与我找到的所有其他答案不同,这包括现有目录和现有文件。我使用带有.htaccess文件的Apache来实现这一点。到目前为止,我的.htaccess文件如下所示:

<IfModule mod_rewrite.c> RewriteEngine On RewriteRule /sub/directory/index\.php - [L] RewriteRule - /sub/directory/index\.php </IfModule> 重新启动发动机 重写规则/sub/directory/index\.php-[L] 重写规则-/sub/directory/index\.php 但由于某些原因,它不会将任何内容重定向到index.php。我也试过:

<IfModule mod_rewrite.c> RewriteEngine On RewriteRule /sub/directory/index\.php - [L] RewriteRule ^.*$ /sub/directory/index\.php </IfModule> 重新启动发动机 重写规则/sub/directory/index\.php-[L] 重写规则^.*$/sub/directory/index\.php 但这给了我一个不可避免的“500错误”。我做错了什么?如何将所有内容重定向到index.php


TIA仍然不知道为什么我的第二个原始.htaccess文件不起作用,但以下内容最终使它起作用:

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} !=/sub/directory/index.php RewriteRule .* /sub/directory/index.php </IfModule> 重新启动发动机 重写cond%{REQUEST_URI}=/sub/directory/index.php 重写规则。*/sub/directory/index.php
但是,我很乐意接受任何能够很好地解释为什么我的第二个原始文件一直给我500个错误的答案。

语法错误,另外在第二次匹配(不是最后一次)后重新匹配第一条规则

任何请求->/sub/directory/index.php->/sub/directory/index.php-[L]

<IfModule mod_rewrite.c>
    RewriteEngine On
    # RewriteRule /sub/directory/index\.php - [L]
    RewriteRule ^(.*)$ /sub/directory/index.php [L]
</IfModule>

重新启动发动机
#重写规则/sub/directory/index\.php-[L]
重写规则^(.*)$/sub/directory/index.php[L]
我的另一个建议(index.php是目录索引文件,是请求目录时的第一个顺序):


重新启动发动机
重写规则^sub/directory/(.*)$/sub/directory/[R=301,L]

另一种方式,您可以使用此代码:(注释第二行和第三行以接受url中的文件和目录)

重新启动发动机 重写cond%{REQUEST_FILENAME}-F 重写cond%{REQUEST_FILENAME}-D 重写规则^(.*)$/index.php?路径=$1[NC,L,QSA] 错误在于此

  • 在每个目录上下文(directory和.htaccess)中,模式仅与部分路径匹配,例如“/app1/index.html”请求可能导致与“app1/index.html”或“index.html”进行比较,具体取决于重写规则的定义位置
和“每个目录重写”:

  • 删除的前缀总是以斜杠结尾,这意味着匹配发生在一个从来没有前导斜杠的字符串上。因此,在每个目录上下文中具有^/never匹配的模式
这意味着,前导斜杠会阻止模式匹配。改成

RewriteRule ^sub/directory/index\.php - [L]
这将解决问题


来自第二条规则(与不匹配的第一条规则结合使用)


这将重写对
/sub/directory/index.php
的任何请求,然后将其再次重写为
/sub/directory/index.php
,依此类推,直到重写模块放弃并显示“太多重定向”错误或类似错误。

我遇到了同样的问题,我可以以某种方式(我猜不是以一种聪明的方式)修复它。 问题在于HTML不会更改为根文件夹

我可以通过使用HTML“base tag”来解决我的问题(您可以根据需要调整根目录的路径)


您还需要给出一个条件,允许仅在目标页面上进行此更改。

您是对的。该行不匹配,导致了问题!谢谢!也许我的问题不清楚,但.htaccess文件实际上位于“/sub/directory/”文件夹中。因此,一旦我将其拆分为仅重写rule^index\.php-[L],它就工作了! RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]
RewriteRule /sub/directory/index\.php - [L]
RewriteRule ^sub/directory/index\.php - [L]
RewriteRule ^.*$ /sub/directory/index\.php