如何.php
使用.htaccess
文件删除扩展名。我尝试了很多示例,但都没有成功。经常出现内部服务器错误。我正在使用 Godaddy Linux 托管。
此代码是我正在使用的最新代码。
<IfModule mod_rewrite.c>
Options All -Indexes
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://a.sprybirds.com/$1 [R=301,L]
# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://a.sprybirds.com/$1 [R=301,L]
# Resolve .php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]
</IfModule>
网站停放在子域上http://subdomain.example.com
,文件夹序列就像web-root/sub_folder/site_folder/
。
答案1
问题缺少示例 URL,但是这对于诊断此类问题确实至关重要……
# Resolve .php file for extensionless php urls RewriteRule ^([^/.]+)$ $1.php [L]
这仅匹配具有单个路径段的 URL,即实际上位于文档根目录中的 URL,例如。/foo
它不会匹配具有多个路径段的 URL,即实际上位于子目录中的 URL,例如/foo/bar
- 这可以解释为什么您会因为“子文件夹内的 php 文件”而获得 404 错误。
您需要删除RewriteRule
图案,以便匹配任意 URL 深度:
RewriteRule ^([^.]+)$ $1.php [L]
通过在否定字符类中包含斜杠,您仅匹配不包含斜杠的 URL。即,仅位于文档根目录中的 URL。
(无需反斜杠在字符类中使用时,对文字点进行转义。)
答案2
./public_html/ 中是否有 .htaccess 文件?如果有,里面有什么?.htaccess 的工作方式是将最接近实际根目录的目录置于最高优先级。
举个例子:
/home/username/public_html/.htaccess
被赋予更高的优先级(即更多的控制权)
/home/username/public_html/sub_directory/.htaccess
如果您的主.htaccess
文件以一种方式设置规则而子目录以另一种方式设置规则,则可能会遇到问题(即错误)。
如果您在实际的 Web 根目录中设置,以下几行可能会导致一些问题,因为 cPanel 允许服务器管理员在 WHM 中默认设置这些选项。如果这些已经设置(特别是 -Indexes),您可能会看到错误。
Options All -Indexes
Options +FollowSymLinks -MultiViews
笔记:此-Indexes
指令通常在客户端被放置到服务器上之前默认设置(或者应该设置,除非有特殊原因不设置),仅供参考。这更像是一种安全建议,以防止目录浏览,因为并非每个客户端都知道,除非index.[ext]
每个目录中都有文件,否则他们的目录将对任何想要查看的人开放。
如果删除这些行可以解决错误,那么您就找到问题了 :)。如果删除这些行不起作用,我们需要开始反复试验。
回到顶部,查看您遇到问题的目录上方的目录。检查 .htaccess 文件,确保您已在您使用的 S/FTP 程序中选中“显示或显示隐藏文件”或将其设置为“是”,因为默认情况下它们并不总是可见的。
从这里开始,最好的做法是备份每个 .htaccess 文件,然后逐个重新添加,直到遇到另一个错误。这样,您就可以记下哪个文件上传导致了错误,我们可以查看那个文件。
更新 #01
由于错误的罪魁祸首很可能确实是-Indexes
,您可以将以下内容添加回文件.htaccess
:
Options +FollowSymLinks -MultiViews
如果这不能解决 404 问题,请尝试以下操作:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# Adds Trailing Slash to the URI as long as it's not for a
# file.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
RewriteRule ^(.*)$ http://subdomain.example.com/$1/ [R=301,L]
# Checks to make sure the request is a directory.
# Checks to see if the request matches a file with a .php ext.
# If all is well, push the request through to the matching file.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^\.]+)/$ http://subdomain.example.com/$1.php