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

Apache .htaccess-强制www,尾部斜杠并删除扩展名,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我一直在玩弄我的.htaccess文件,到目前为止,它还在工作,但是有一些bug 我试图在删除.php扩展名并添加尾随斜杠的同时强制使用WWW前缀(仅限根,不在子域上) 代码 # Force WWW prefix RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUE

我一直在玩弄我的.htaccess文件,到目前为止,它还在工作,但是有一些bug

我试图在删除.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扩展名结尾),并且通常目录实际上不起作用。 编辑

通常目录实际上不起作用

这意味着服务器抛出一个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]
您还可以避免重定向以在子域的主机名中包含www如果检查TLD之前至少有一台主机,请尝试向前缀规则添加另一个条件:

# 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]

我以为就这样了,但是少了一些东西!没有强制尾随斜杠(如果有人删除它,我希望添加它),如果有人添加它,它也不会删除.php,我希望它这样做。@JakeGriffin您仍然在使用原始规则,对吗?只需要对您原来的htaccess文件做一些更改就行了。对不起,我有点困惑。我不想听起来很愚蠢,但我想确保我做得正确。我用你给我的替换了我的Force WWW前缀,也用你给我的条件替换了我的重写规则行。这就是我应该做的吗?www不强制删除尾随斜杠会导致错误。请看,这正是我的文件看起来像的原因。它不强制www,删除尾随斜杠时存在未找到错误。但是,如果删除了尾随斜杠和www前缀,但添加了.php,那么它就可以正常工作,即添加www和尾随斜杠并删除.php。@JakeGriffin您的主机名是什么?你有一个重写库吗?