如何使这个 .htaccess 服务器友好并应用于 .php?
How to make this .htaccess server-friendly and apply to .php?
除了最基础的知识,我对 .htaccess 文件一无所知。
我从互联网上的不同来源复制并粘贴了这段代码,到目前为止,它是有效的。代码 (a) 定义 404-errorpage,(b) 定义某些文件应该“保存”多长时间,(c) 从所有 URL 中删除 .html-扩展名,以及 (d) 添加尾部斜线他们。
我只想知道两件事:
- 如何将此代码不仅应用于 .html-文件,而且 也应用于 .php-文件?我怀疑我必须更改第 6 行,但我不确定。
- 是否有更多有经验的用户对这段代码的服务器友好性有什么意见?正如我所说,我只是复制了代码,但我想知道是否有任何不必要的重定向、可能的 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.php
和 foo.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 结构,所以只有你才能真正回答这个问题......测试测试测试。
但除此之外,这些更新后看起来还不错。
除了最基础的知识,我对 .htaccess 文件一无所知。
我从互联网上的不同来源复制并粘贴了这段代码,到目前为止,它是有效的。代码 (a) 定义 404-errorpage,(b) 定义某些文件应该“保存”多长时间,(c) 从所有 URL 中删除 .html-扩展名,以及 (d) 添加尾部斜线他们。
我只想知道两件事:
- 如何将此代码不仅应用于 .html-文件,而且 也应用于 .php-文件?我怀疑我必须更改第 6 行,但我不确定。
- 是否有更多有经验的用户对这段代码的服务器友好性有什么意见?正如我所说,我只是复制了代码,但我想知道是否有任何不必要的重定向、可能的 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.php
和 foo.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 结构,所以只有你才能真正回答这个问题......测试测试测试。
但除此之外,这些更新后看起来还不错。