微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

前端控制器的Apache ModRewrite规则和“ 301永久移动”

如何解决前端控制器的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 举报,一经查实,本站将立刻删除。