分组文件扩展名以重写URL [.htaccess]

时间:2015-06-06 02:09:13

标签: .htaccess mod-rewrite url-rewriting rewrite file-extension

如何将这两者组合在一起;它就像“。(html | php)$” - 请提供代码。

注意,答案应该适用于所有文件扩展名:您对删除每个文件扩展名的想法是什么;评论所使用的代码 - 因为它很难找到。

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.html\ HTTP
RewriteRule (.*)\.html$ $1 [R=301]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.html [L]

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
RewriteRule (.*)\.php$ $1 [R=301]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]

2 个答案:

答案 0 :(得分:0)

似乎你已经用

回答了你自己的问题
  

就像“。(html | php)$”

你只需要尝试一下。看看这是否适合您对html and php个文件进行分组。

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.(php|html)\ HTTP
RewriteRule ^ %1 [R=301,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/]+)/?$ $1.php [L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^/]+)/?$ $1.html [L]

还有另一种可能的解决方案。是不使用上面的代码并使用MultiViews。下面的一行代码。

Options +FollowSymLinks +MultiViews

答案 1 :(得分:0)

不幸的是,这是不可能的。

RewriteCond TestString 部分只能包含普通字符串,并允许服务器变量(例如HTTP_REFERER)和反向引用({{1}例如,}和$1

因此,您不能在 TestString 中包含表达式 - 只有 CondPattern %1的第二部分)允许使用表达式。

你可以做的最好的事情是使用一个表达式去掉你不想要的扩展名,然后,对于你已经剥离的每个扩展名,确定它是否存在并相应地重写 - 如下所示:

RewriteCond

附注:如果Apache在RewriteEngine on # Step 1: Strip out extensions you don't want for files that actually exist RewriteCond %{THE_REQUEST} ^GET\ (.*)\.(html|php)\ HTTP RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ %1 [R=301,L] # Step 2: For each extension stripped, rewrite for existing files RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule (.*) $1.html [L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule (.*) $1.php [L] 文件中实现某种循环,那将会非常棒 - 这有助于简化这种方法。不幸的是,事实并非如此,所以上面几乎是最好的方法。