apache - .htaccess - 强制 www、尾部斜杠并删除扩展名

标签 apache .htaccess mod-rewrite

我一直在研究我的 .htaccess 文件,到目前为止,它可以正常工作,但有一些错误。

我试图在删除 .php 扩展名并添加尾部斜杠时强制使用 WWW 前缀(只是根,而不是子域)。

代码

# Force WWW prefix
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]


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

RewriteRule (.*)/$ $1.php [L]


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

它成功地强制了 WWW,即使我删除了它,.php 扩展名也被删除了,即使我添加了它,并且尾部的斜杠被强制了,即使我删除了它。但是,有时我会收到 404 not found 错误,表示请求的 URL(通常以 .php 扩展名结尾)在服务器上找不到,而且通常目录实际上不起作用。 编辑

often directories do not actually work

表示服务器抛出 404 错误,提示“在此服务器上未找到/directory.php”。

谁能帮我一把?

最佳答案

在盲目附加 php 扩展名之前,您需要检查您是否真的在重写 php 文件。所以这个规则:

RewriteRule (.*)/$ $1.php [L]

需要一些条件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]

如果您检查 TLD 之前至少有 1 个主机,您也可以避免重定向以在子域的主机名中包含 www,尝试向您的前缀规则添加另一个条件:

# Force WWW prefix
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} ^([^.]+)\.([a-z]{2,4})$ [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

编辑:

完整文件应该如下所示:

RewriteBase /

# Force WWW prefix
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} ^([^.]+)\.([a-z]{2,4})$ [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]


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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]


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

关于apache - .htaccess - 强制 www、尾部斜杠并删除扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856853/

相关文章:

java - 在 apache tomcat 7 中监听上下文路径的变化

c# - 使用 Php Mysql 进行许可证检查

php - 将用户从动态网址重定向到静态网址(带有两个参数)

php - 如何在 lighttpd 中启用 mod 重写

php - 如何将 URL 中的空格替换为连字符

apache - 使用 Apache htaccess 文件将 URL 更改为小写

apache - 什么是代理服务器以及它如何帮助服务器架构

.htaccess - 网站网址从自然搜索重定向到主页

php - 使用 .htaccess 和 mod_rewrite 强制 SSL/https

php - 如何制定从 id 到 name 的 htaccess 规则