如何解决前端控制器的Apache ModRewrite规则和“ 301永久移动”
我现在正在做什么
我正在为客户开发后端。
以前,他将网站数据与文件混合在一起,以供朋友和其他目的下载。
示例:
/public
/somedir
somesubdirfile
anotherfile1
anotherfile2
foobar.html
index.html
现在,我实现了通用的重写规则,以将所有请求代理到新的网站index.PHP
。
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine "On"
RewriteCond "%{REQUEST_FILENAME}" ".htaccess"
RewriteCond "%{REQUEST_FILENAME}" ".htpasswd"
RewriteCond "%{REQUEST_FILENAME}" "!-s"
RewriteCond "%{REQUEST_FILENAME}" "!-l"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
RewriteRule "^.*$" "public/index.PHP" [NC,L]
</IfModule>
好,工作。
现在我将所有杂物都移到了单独的文件夹中。
/resources
/somedir
somesubdirfile
anotherfile1
anotherfile2
foobar.html
/public
index.PHP
我需要做的事
...是要更改重写规则。
如果请求与/public
中的特定文件或符号链接不匹配,则必须测试该请求是否与/resources
中的特定文件或符号链接相匹配。如果存在匹配项,则必须发送301 Moved Permanently
并将请求重定向到/resources
。如果没有匹配项,则必须重定向到public/index.PHP
。
但是我真的坚持了解如何编写复杂的重写规则,就像我要求的那样。
请在这里需要帮助。
解决方法
您可以在网站根.htaccess中尝试以下规则:
RewriteEngine On
# if it exists in /resources then redirect
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/resources/$0 -f
RewriteRule .+ /resources/$0 [L,NE,R=301]
# else route to public/index.php
RewriteCond %{REQUEST_URI} \.(htaccess|htpasswd) [NC]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ public/index.php [L]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。