我有一个网站组成如下:

index.php
page1.php
page2.php
page3.php
 - images
   image1.jpg
   image2.jpg
 - style
   style.css

我想写一个htaccess文件,可以给我搜索引擎优化友好的网址.例如:

  • https://example.com/page2.php应该是https://example.com/page2

而且:

  • https://example.com/page2.php#mytab应该是https://example.com/page2#mytab

但我只想在第一个目录上应用这些规则,这样就可以继续使用扩展访问"images"和"style"目录.

有人能帮忙吗?谢谢

推荐答案

  1. 你应该已经链接到了你的内部URL上的文件without.php扩展名(即href="/page1",而不是href="/page1.php").我还假设您的URL不包含点(通常会分隔文件扩展名).

  2. 如果需要,执行重写以附加.php扩展名.这需要接近根.htaccess文件的顶部:

    RewriteEngine On
    
    # Internally rewrite extenionless URLs to append ".php" if required
    # Tests only requests (that do not contain a dot) in the root directory
    RewriteCond %{DOCUMENT_ROOT}/$1.php -f
    RewriteRule ^([^./]+)$ $1.php [L]
    

    RewriteCond(文件系统判断)的替代方案:

    RewriteCond %{REQUEST_FILENAME}.php -f
    :
    

    或者,您可以完全删除RewriteCond指令,无条件地重写根目录中的所有请求(无文件扩展名)以附加.php扩展名.

  3. (可选)如果您正在更改URL struct ,并从URL中删除.php个,并且旧URL已被搜索引擎索引和/或由第三方链接,那么您还需要实施重定向,以删除SEO的.php扩展名.

    在上述RewriteEngine指令之后(内部重写之前)立即添加以下内容:

    # Redirect to remove the `.php` extension inbound requests
    # Only affects the root directory
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^([^./]+)\.php$ /$1 [R=301,L]
    

    针对REDIRECT_STATUS环境变量进行测试的condition确保了我们不会在以后的重写中重定向已经重写的请求,从而避免了重定向循环.

    注意:首先使用302(临时)重定向进行测试,以避免潜在的缓存问题.

  4. 或者(而不是#3),为了防止直接访问.php文件并提供404 Not Found,请在上述RewriteEngine指令之后立即添加以下内容(在内部重写之前):

    # Prevent direct access to ".php" file and serve a 404 instead
    # Only affects the root directory
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^([^./]+)\.php$ - [R=404]
    

每次发生404错误时,显示自定义404页面内容的最佳方式是什么?(我不想使用重定向)

.htaccess文件的顶部使用以下命令,将完整的URL路径传递给ErrorDocument指令.

ErrorDocument 404 /error-docs/e404.php

使用Sub的请求(称为"外部重定向"的文件没有内部错误).

请注意,这里应该包括.php文件扩展名——这对用户来说是完全不可见的.

Php相关问答推荐

Laravel有一个具有两个匹配字段

Laravel 10查询中的多个where子句

Woocommerce自定义变体html表仅显示带值的列

使用WooCommerce本机产品短码时不考虑价格筛选(_SHORT CODE)

在WooCommerce产品档案页面中显示产品销售百分比

在Laravel中,如果我用session—put()存储一些信息,客户端浏览器是否可以使用这些信息?>

从WooCommerce订单状态更改更新用户自定义元数据

只收取WooCommerce中最高的运费

WooCommerce中基于用户角色的不同产品差价

如果日期是过go 日期,则隐藏事件发布类型

根据发货类别在WooCommerce产品页面中显示快捷代码

防止在WordPress短代码中显示重复产品并请求代码更正

使用简码在 WooCommerce 我的帐户中显示一些用户数据

WooCommerce 回购自定义插件:如何更新用户钱包?

PHP向API发送curl请求

正则表达式将文本替换为标签 html 以字符开头

使用 RSA 2048 公钥验证 RSA PKCS#1v1.5 SHA 256 签名

为什么非贪婪匹配会消耗整个模式,即使后面跟着另一个非贪婪匹配

mysql / sql修复多对多数据库中的行

如何通过本地主机在同一台 PC 上同时运行 Microsoft IIS 和 WAMP