如何将mod_rewrite规则应用于目录中的文件?

时间:2019-06-08 21:50:09

标签: php regex apache .htaccess mod-rewrite

我正在尝试将htaccess文件中的重写条件应用于网站上特定目录中包含的所有页面,而不是目录索引本身。

最终,我正在尝试从特定目录内的页面中删除.php文件扩展名。

我现在所拥有的:

https://www.example.com/directory/page-1.php

我想要达到的最终结果:

https://www.example.com/directory/page-1

此外,如果用户尝试访问页面的.php版本,则页面301重定向到没有.php文件扩展名的新版本。

匹配示例:

https://www.example.com/directory/page-1.php
https://www.example.com/directory/page-2.php

不应匹配:

https://www.example.com/directory/

这是我到目前为止所拥有的:

RewriteCond %{REQUEST_URI} \/directory\/[^\s]+$

应该如何编写RewriteRule?

2 个答案:

答案 0 :(得分:0)

可以帮助我们找到RewriteRule的表达式如下:

^https?:\/\/(www\.)?example\.com\/directory\/[^\s]+\.php$

会使我们不需要的URL失败,并传递所需的URL。

Demo

我们的RewriteRule可能看起来像:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} (.*\/directory\/)([^\s]+)\.php [NC]
    RewriteRule (.*directory\/)([^\s]+)\.php   $1$2 [L,R=301]
</IfModule>

Demo

RewriteRule测试

您可以在htaccess.madewithlove.be中测试RewriteRules。

RegEx电路

jex.im可视化正则表达式:

enter image description here

每次更改htaccess文件时,我们可能还希望清除浏览器缓存。

答案 1 :(得分:0)

您可以在subfolder中的htaccess中使用以下规则(如果尚不存在):

 RewriteEngine on
 #rule for /subfolder/htaccess 
#redirect /subfolder/file.php to /file
#The condition bellow prevents infinite loop/Too many redirects  error
RewriteCond %{ENV_REDIRECT_STATUS} ^$
RewriteRule ^(.+)\.php$ /subfolder/$1 [L,R]
#internally map /subfolder/file to /subfolder/file.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)/?$ /subfolder/$1.php [L]

如果要改用htaccess根文件,则添加以下内容:

 RewriteEngine on
 #rule for root/.htaccess 
#redirect /subfolder/file.php to /file
#The condition bellow prevents infinite loop/Too many redirects  error
RewriteCond %{ENV_REDIRECT_STATUS} ^$
RewriteRule ^subfolder/(.+)\.php$ /subfolder/$1 [L,R]
#internally map /subfolder/file to /subfolder/file.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^subfolder/(.+)/?$ /subfolder/$1.php [L]