You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:01:20