如何通过.htaccess禁用非友好URL,仅启用友好URL?
.htaccess配置修复:启用友好URL并保留_process文件夹权限
需求与问题
- 仅允许友好URL(如
myexample.sk/all-posts)访问,禁用带.php后缀的非友好URL(如myexample.sk/all-posts.php) - 必须保留
/_process/目录下所有文件的正常访问权限(网站数据处理依赖该目录) - 已实现
router.php及Router类,但当前.htaccess规则无效,且出现example.sk/index.php被托管商自动转向index.html的异常
当前使用的.htaccess代码:
# 启用Rewrite引擎 RewriteEngine On # 不存在的URL跳转到404页面 ErrorDocument 404 /404.php # www域名转非www域名 RewriteCond %{HTTP_HOST} ^www\.example\.sk [NC] RewriteRule ^(.*)$ http://example.sk/$1 [L,R=301,NC] # 强制HTTPS访问 RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 将所有非文件/非目录的请求转发到router.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /router.php [L,QSA] # 禁止显示目录列表 Options -Indexes # 禁止直接访问当前目录下的PHP文件 <Files *.php> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Files> # 禁止访问.ht开头的配置文件 <Files ".ht*"> Require all denied </Files> # 内容压缩配置 <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript </IfModule> # 浏览器缓存过期设置 <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year" ExpiresDefault "access plus 2 days" </IfModule>
修复后的.htaccess配置
# 设置默认索引优先级,解决托管商转向index.html的问题 DirectoryIndex index.php index.html # 启用Rewrite引擎 RewriteEngine On # 404页面配置 ErrorDocument 404 /404.php # www域名转非www域名(保持HTTPS) RewriteCond %{HTTP_HOST} ^www\.example\.sk [NC] RewriteRule ^(.*)$ https://example.sk/$1 [L,R=301,NC] # 强制HTTPS访问 RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 优先放行_process目录下的所有请求(不经过后续规则) RewriteRule ^_process/ - [L] # 路由规则:将非文件/非目录的请求转发到router.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /router.php [L,QSA] # 禁止直接访问除router.php外的所有PHP文件(_process目录已提前放行) <FilesMatch "^(?!router\.php).*\.php$"> # 兼容Apache 2.2和2.4的权限语法 <IfModule mod_authz_core.c> Require all denied </IfModule> <IfModule !mod_authz_core.c> Order Deny,Allow Deny from all </IfModule> </FilesMatch> # 禁止显示目录列表 Options -Indexes # 禁止访问.ht开头的配置文件 <Files ".ht*"> Require all denied </Files> # 内容压缩配置 <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript </IfModule> # 浏览器缓存过期设置 <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year" ExpiresDefault "access plus 2 days" </IfModule>
关键修改说明
- 修复index.php转向问题:添加
DirectoryIndex index.php index.html,强制服务器优先使用index.php作为默认索引文件 - 保留_process目录权限:新增
RewriteRule ^_process/ - [L],该规则优先级最高,直接放行_process目录下的所有请求,不受后续路由或权限限制 - 禁用非友好URL:使用
<FilesMatch>规则精确禁止访问除router.php外的所有.php文件,避免误拦截必要的路由文件 - 权限兼容性优化:同时支持Apache 2.2和2.4的权限语法,适配不同托管商环境
- 规则顺序调整:将优先级高的规则(如HTTPS强制、process目录放行)放在前面,确保执行逻辑正确
内容的提问来源于stack exchange,提问作者Dump
相关产品推荐
相关产品推荐

