.htaccess:如果文件不存在,则重定向

时间:2018-07-30 16:48:34

标签: .htaccess redirect yii2

这是一个很受欢迎的问题,但是在我的情况下,有一些区别使一切变得更加困难。

Apache2 Web服务器,启用了prettyUrl的Yii2框架。

这是Yii2提供的初始.htaccess文件:

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

/docs个Web目录。如果文件不存在,我想从文件中获取文件;如果文件不存在,我希望重定向到/docs-generator/create?file=<file_name>

因此,我添加了一条规则:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/docs
RewriteRule ^docs/([\w-_.]+) http://kz_proj.test/docs-generator/create?file=$1 [L]

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

这是可行的,但很奇怪...首先,我无法从http://kz_proj.test/docs-generator/create?file=$1中删除测试主机名。没有全名就无法使用。第二个是关于^/docs^docs/([\w-_.]+)的,但没有开头字符。为什么在我的情况下这些规则的第一部分不能相同?

我认为规则有问题...

1 个答案:

答案 0 :(得分:1)

您可以使用:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^docs/([\w-_.]+) /docs-generator/create?file=$1 [L,R=301]

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule ^ index.php

它与域名一起使用,因为在这种情况下,它必须是重定向,但并非没有。我添加了[R=301]来强制重定向。

无需添加RewriteCond %{REQUEST_URI} ^/docs
因为测试与RewriteRule ^docs

相同

为什么在您的情况下这些规则的第一部分不能相同?
REQUEST_URI始终以/开头 并且RewriteRule test path从不以.htaccess中的/开头(为什么????)