这是一个很受欢迎的问题,但是在我的情况下,有一些区别使一切变得更加困难。
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-_.]+)
的,但没有开头字符。为什么在我的情况下这些规则的第一部分不能相同?
我认为规则有问题...
答案 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中的/
开头(为什么????)