我的索引页面和/ page之类的链接工作正常,但我从/page.php中删除php的重写规则似乎是错误地写了url。
示例:http://www.example.com/folder/page.php将重定向到不存在的http://www.example.com/folder/folder/page
# Remove .php extention
RewriteCond %{THE_REQUEST} \s/(.+?)\.php(?:\s|\?) [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ %1? [R=301]
# Rewrite to PHP file extension (if existing) without changing url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L]
答案 0 :(得分:1)
您的问题是您将上述代码放在此.htaccess
目录中的http://www.example.com/folder/
文件中,因此当一个页面没有.php时,如果您请求http://www.example.com/folder/page
,它将得到妥善处理它会给你这个结果http://www.example.com/folder/page
,没有.php,因为它将由你给定代码的第二部分处理
# Rewrite to PHP file extension (if existing) without changing url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L]
这意味着当文件没有.php时会产生相同的文件,很好。
但是当您与.php
一起撰写相同请求时出现此问题,因此请求将为http://www.example.com/folder/page.php
,并且根据您的代码之一
# Remove .php extention
RewriteCond %{THE_REQUEST} \s/(.+?)\.php(?:\s|\?) [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ %1? [R=301]
会立即正确删除扩展程序.php
,但问题在于代码:
RewriteRule ^ %1? [R=301]
RewriteRule目标中的路径不正确,因此您会看到它两次,您应该添加
RewriteBase /
以上
RewriteRule ^ %1? [R=301]
或者只需将其替换为:
RewriteRule ^ /%1? [R=301]
它会正常工作。 `
答案 1 :(得分:0)
您可以使用以下规则:
# remove .php extension
RewriteCond %{THE_REQUEST} ^GET\s(.+?)\.php[\s?/] [NC]
RewriteRule ^ %1? [R=301,L]
# Rewrite to PHP file extension (if existing) without changing url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]
确保在测试之前清除浏览器缓存。