mod_rewrite两次重写到目录?

时间:2016-05-05 19:45:04

标签: apache .htaccess mod-rewrite url-rewriting

我的索引页面和/ 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]

2 个答案:

答案 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]

确保在测试之前清除浏览器缓存。