如何使这个 .htaccess 服务器友好并应用于 .php?

How to make this .htaccess server-friendly and apply to .php?

除了最基础的知识,我对 .htaccess 文件一无所知。
我从互联网上的不同来源复制并粘贴了这段代码,到目前为止,它是有效的。代码 (a) 定义 404-errorpage,(b) 定义某些文件应该“保存”多长时间,(c) 从所有 URL 中删除 .html-扩展名,以及 (d) 添加尾部斜线他们。 我只想知道两件事:

  1. 如何将此代码不仅应用于 .html-文件,而且 也应用于 .php-文件?我怀疑我必须更改第 6 行,但我不确定。
  2. 是否有更多有经验的用户对这段代码的服务器友好性有什么意见?正如我所说,我只是复制了代码,但我想知道是否有任何不必要的重定向、可能的 SEO 惩罚或类似的东西。

这是我在 .htaccess 文件中使用的代码:

ErrorDocument 404 /404.html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ .html
RewriteRule ^([^/]+)/([^/]+)/$ //.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ // [R=301,L]
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/html "access plus 0 seconds"
  ExpiresByType text/css "access plus 1 week"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType audio/ogg "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType video/mp4 "access plus 1 month"
  ExpiresByType video/ogg "access plus 1 month"
  ExpiresByType video/webm "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 month"
</IfModule>

感谢您的帮助!

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ .html
RewriteRule ^([^/]+)/([^/]+)/$ //.html

您不能简单地“更改第 6 行”来处理 .php 文件。既然你引入了歧义。例如,/foo 的请求应该映射到 .html 还是 .php?您需要确定一个或另一个的优先级,并检查是否存在相应的 .php.html 文件。

顺便说一下,RewriteCond 指令只适用于后面的第一个 RewriteRule 指令,所以上面的第二个 RewriteRule 指令被无条件地处理。 (尽管您不需要在此处检查“文件”,因为 filenames 不以斜杠结尾。)

此外,一个或两个路径段(分别是第一个和第二个 RewriteRule 指令)的处理可以合并到一个规则中。

请尝试以下操作来处理 .html.php 文件。我假设 .php 文件优先。因此,如果您请求 /foo 并且 foo.phpfoo.html 都存在,那么将提供 foo.php(只有您直接请求才能访问 foo.html)。

# Rewrite request to ".php" if it exists
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^((/?[^/]+){1,2})/$ .php [L]

# Otherwise, rewrite request to ".html" if it exists
RewriteCond %{DOCUMENT_ROOT}/.html -f
RewriteRule ^((/?[^/]+){1,2})/$ .html [L]

另请注意包含 L (last) 标志。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ // [R=301,L]

可以通过将第三个条件中的测试移动到 RewriteRule 模式 来简化和优化这些指令,并避免不必要的文件系统检查。

例如:

# Append trailing slash if omitted
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !(^$|\.[a-zA-Z0-9]{1,5}|/)$ %{REQUEST_URI}/ [R=301,L]

另外,可以说这些规则的顺序是错误的(尽管在这种情况下可能不会有什么不同)。作为一般规则,外部重定向(上面)应该在 之前 附加 .php.html 扩展的内部重写,以避免内部重写被无意中重定向.

因此,总而言之,文件的第一部分变为:

ErrorDocument 404 /404.html

RewriteEngine On

# Append trailing slash if omitted
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !(^$|\.[a-zA-Z0-9]{1,5}|/)$ %{REQUEST_URI}/ [R=301,L]

# Rewrite request to ".php" if it exists
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^((/?[^/]+){1,2})/$ .php [L]

# Otherwise, rewrite request to ".html" if it exists
RewriteCond %{DOCUMENT_ROOT}/.html -f
RewriteRule ^((/?[^/]+){1,2})/$ .html [L]

然后是 mod_expires 指令...

ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"

这些指令中只有一个是必需的。您的服务器将提供 application/javascript mime 类型或 application/x-javascript 的 JS 文件。它不能(不应该)两者兼而有之。很可能是前者。

...how server-friendly this code is? As I said, I just copied the code, but I want to know if there are any unnecessary redirects, possible SEO-penalties or something like that.

不确定“服务器友好”是什么意思。但除此之外,这是否按预期工作,没有不必要的重定向,实际上取决于整个站点的 URL 结构,所以只有你才能真正回答这个问题......测试测试测试。

但除此之外,这些更新后看起来还不错。