gpt4 book ai didi

.htaccess - mod 重写以删除文件扩展名,添加尾部斜杠,删除 www 并在没有文件/目录可用时重定向到 404

转载 作者:行者123 更新时间:2023-12-05 01:48:39 25 4
gpt4 key购买 nike

我想在我的 .htaccess 文件中创建重写规则来执行以下操作:

  • 当通过 domain.com/abc.php 访问时:删除文件扩展名,附加尾部斜杠并加载 abc.php 文件。重写后的 url 应该是这样的:domain.com/abc/

  • 当通过 domain.com/abc/访问时:保持 url 不变并加载 abc.php

  • 通过 domain.com/abc 访问时:附加尾部斜杠并加载 abc.php。重写后的 url 应该是这样的:domain.com/abc/

  • 删除 www

  • 当访问的 url 未解析为文件夹或文件时重定向到 404 页面 (404.php),例如当访问 domain.com/nothingthere.php 或 domain.com/nothingthere/或 domain.com/nothingthere 时

  • 做一些从旧 url 到新 url 的永久性 301 重定向(例如 domain.com/abc.html 到 domain.com/abc/)

所有的 php 文件都位于文档根目录中,但是如果有一个解决方案可以使诸如 domain.com/abc/def/(将加载 domain.com/abc/def.php)之类的 url 也可以工作,那么它会也很棒,但不是必须的

这就是我目前所拥有的(从网络上的各种来源和样本中收集而来

<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
# redirect from www to non-www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

# remove php file extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

# add trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*[^/]$ /$0/ [L,R=301]

# resolve urls to matching php files
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ $1.php [L]

有了这个,前四个要求似乎有效,无论我输入 domain.com/abc.php、domain.com/abc/还是 domain.com/abc,最终 url 总是以 domain.com/abc/结束并加载 domain.com/abc.php。

当我输入一个解析为不存在的文件的 url 时,我收到错误 310(重定向循环),而实际上应该加载 404 页面。此外,我还没有尝试过子文件夹是否有效,但正如我所说,这是低优先级的。我很确定我可以在上面对遗留 url 进行永久 301 重定向,也没有任何问题,只是想提一下。所以真正的问题是 404 页面无法正常工作。

最佳答案

我在让 ErrorDocument 可靠地处理重写错误方面遇到了问题,因此我倾向于在我的重写级联中正确处理无效页面。我试图用它来涵盖所有测试向量。没有发现任何差距。

一些一般要点:

  • 您需要在此使用DOCUMENT_ROOT 环境变量。不幸的是,如果您使用共享托管服务,那么在重写执行期间无法正确设置,因此托管提供商会设置一个影子变量来完成相同的工作。我使用的是 DOCUMENT_ROOT_REAL,但我也遇到过 PHP_DOCUMENT_ROOT。执行 phpinfo 以找出用于您的服务的内容。
  • 有一个调试信息规则,只要您适本地替换 DOCROOT 就可以修整
  • 您不能总是在您期望的地方使用 %{REQUEST_FILENAME}。这是因为如果 URI 映射到 DOCROOT/somePathThatExists/name/theRest,则 %{REQUEST_FILENAME} 设置为 DOCROOT/somePathThatExists/name而不是等同于规则匹配字符串的完整模式。
  • 这是“按目录”,因此没有前导斜线,我们需要意识到重写引擎将在 .htaccess 文件上循环,直到发生不匹配停止。
  • 这会处理所有有效组合,并在最后重定向到 404.php,我假设它会设置 404 状态并显示错误页面。
  • 它目前将以 SEO 方式解码 someValidScript.php/otherRubbish,但额外的逻辑也可以选择这个。

所以这是 .htaccess 片段:

Options -Indexes -MultiViews
AcceptPathInfo Off

RewriteEngine On
RewriteBase /

## Looping stop. Not needed in Apache 2.3 as this introduces the [END] flag
RewriteCond %{ENV:REDIRECT_END} =1
RewriteRule ^ - [L,NS]

## 302 redirections ##

RewriteRule ^ - [E=DOCROOT:%{ENV:DOCUMENT_ROOT_REAL},E=URI:%{REQUEST_URI},E=REQFN:%{REQUEST_FILENAME},E=FILENAME:%{SCRIPT_FILENAME}]

# redirect from HTTP://www to non-www
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

# remove php file extension on GETs (no point in /[^?\s]+\.php as rule pattern requires this)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_METHOD} =GET
RewriteRule (.*)\.php$ $1/ [L,R=301]

# add trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*[^/]$ $0/ [L,R=301]

# terminate if file exists. Note this match may be after internal redirect.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L,E=END:1]

# terminate if directory index.php exists. Note this match may be after internal redirect.
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{ENV:DOCROOT}/$1/index.php -f
RewriteRule ^(.*)(/?)$ $1/index.php [L,NS,E=END:1]

# resolve urls to matching php files
RewriteCond %{ENV:DOCROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L,NS,E=END:1]

# Anything else redirect to the 404 script. This one does have the leading /

RewriteRule ^ /404.php [L,NS,E=END:1]

享受 :-)

关于.htaccess - mod 重写以删除文件扩展名,添加尾部斜杠,删除 www 并在没有文件/目录可用时重定向到 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com