我正在尝试将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?
答案 0 :(得分:0)
可以帮助我们找到RewriteRule的表达式如下:
^https?:\/\/(www\.)?example\.com\/directory\/[^\s]+\.php$
会使我们不需要的URL失败,并传递所需的URL。
我们的RewriteRule可能看起来像:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} (.*\/directory\/)([^\s]+)\.php [NC]
RewriteRule (.*directory\/)([^\s]+)\.php $1$2 [L,R=301]
</IfModule>
您可以在htaccess.madewithlove.be中测试RewriteRules。
jex.im可视化正则表达式:
每次更改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]