为什么这个mod_rewrite没有重定向?

时间:2016-04-24 18:30:10

标签: mod-rewrite

我通过index.php发送每个请求,但我的blog子目录中的页面除外。我已经能够在父文件夹中使用mod_rewrite执行此操作;

    RewriteCond %{REQUEST_URI} !^/blog
    RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

但是,我还想将请求发送到我的博客文件夹,如果它们的格式为:

文档/一些文件。

我试过了:

RewriteRule ^/documentation/(.+)$ https://www.some_domain.com/blog/documentation/$1

看起来就像我的请求在这种情况下没有被发送到博客文件夹一样。我的完整代码如下:

RewriteEngine On

#redirect to index.php as appropriate
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^/documentation/(.+)$ https://www.some_domain.com/blog/documentation/$1

RewriteCond %{REQUEST_URI} !^/blog

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

编辑:

我在下面使用了@Rijul建议的略微修改版本,在将RewriteRule移到RewriteCond之前,它按照我的希望工作。换句话说,重写文档执行重写到博客子文件夹。并且,所有其他请求都通过我的index.php文件。在这一点上,我想了解原因。

RewriteEngine On
RewriteRule ^documentation/?(.*)$ /blog/documentation/$1 [R=301,L]

#redirect to index.php as appropriate
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l


RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

1 个答案:

答案 0 :(得分:2)

据我所知

RewriteEngine On

如果没有这个,所有重写规则和条件都将被忽略

RewriteRule ^documentation/?(.*)$ /blog/documentation/$1 [R=301,L]

将文档重写为博客/文档

RewriteCond %{REQUEST_FILENAME} !-d

此重写条件检查请求的目录名称是否不退出。如果它没有退出。然后进入下一个条件

RewriteCond %{REQUEST_FILENAME} !-f

此重写条件检查所请求的文件名是否不退出。如果它没有退出。然后进入下一个条件

RewriteCond %{REQUEST_FILENAME} !-l

此重写条件检查所请求的符号链接是否未退出。如果它没有退出。然后继续重写规则

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

重写为index.php?url =

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

写这样的重写条件会产生一个和操作。

  

(没有文件以该名称退出)和(该名称中没有目录退出)和   (没有符号链接以该名称退出)

如果这是真的,那么重写到php文件。对于 / blog (该名称中没有目录退出)将变为false(因为这样的目录退出)