繁体   English   中英

如果文件存在,则重写扩展名,如果文件不存在,则使用htaccess进行重定向

[英]Rewrite extension if file exists, redirect if file does not exist, with htaccess

使用.htaccess,我想将不存在的文件重定向到控制器页面,并将确实存在的.php文件的扩展名重写为.html扩展名。 如果文件存在并且是.html页面,我希望它保持不变。 每当我尝试将重写规则从.php注入到.html时,我似乎都会把重定向重定向到控制器页面。 所以我不确定从这里去哪里:

Options -Indexes
Options +FollowSymLinks
DirectoryIndex index.php
ErrorDocument 404 /404.php

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ mycontroller.php [L,QSA]
</IfModule>

我将不胜感激任何帮助。

编辑

我似乎在这里找到了大多数答案(但是我必须省去ReweriteBse否则它不起作用)。 最大的问题是,现在,我现有的.html文件不起作用,它仅提供带有.html扩展名的.php文件,并将其他所有文件定向到控制器。 现有的.html文件转到我的404页。 我想知道如何保持现有的.html文件完整。 我的新代码如下:

  RewriteEngine on

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

  RewriteCond %{THE_REQUEST} (.*)\.html  
  RewriteRule ^(.*)\.html $1.php [L]  

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ mycontroller.php [L,QSA]

尝试:

<IfModule mod_rewrite.c>
  RewriteEngine on

  # If a request for a php file is made, check that it's actually a php file then redirect the browser
  RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*?)\.php($|\ )
  RewriteCond %{REQUEST_FILENAME} -f
  RewriteRule ^(.*?)\.php$ /$1.html [L,R=301]

  # If a request for an html file is made, check that it's a php file, and if so, serve the php file:
  RewriteCond %{REQUEST_URI} ^/(.*?)\.html$
  RewriteCond %{DOCUMENT_ROOT}/%1.php -f
  RewriteRule ^ /%1.php [L]

  # Everything else goes to the controller
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ mycontroller.php [L,QSA]
</IfModule>

试试这个(我添加了一个重写条件,以避免无限循环b遮盖参数r = 0并测试它是否存在):

  RewriteEngine on

  RewriteCond %{QUERY_STRING} ^(.*&)?r=0(&.*)?$
  RewriteRule ^(.*)\.php$ $1.html [L,R=301,QSA]

  RewriteCond %{REQUEST_FILENAME} ^(.*)\.html$
  RewriteCond %1.php -f
  RewriteRule ^(.*)\.html$ $1.php?r=0 [L,QSA]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ mycontroller.php [L,QSA]

我敢肯定,有更好的方法可以做到这一点,但是以下这些可以满足我的需求。 尽管我进行了尝试,但提供的其他答案似乎没有用。

Options -Indexes
Options +FollowSymLinks
DirectoryIndex index.php
ErrorDocument 404 /404.php

<IfModule mod_rewrite.c>
  RewriteEngine on

  # Check if .html file already exists -- if so, do nothing
  RewriteCond %{REQUEST_FILENAME} -f
  RewriteCond %{THE_REQUEST} (.*)\.html  
  RewriteRule ^.*$ - [NC,L] 

  # Check if .php file already exists -- if so, rewrite extension to .html
  RewriteCond %{REQUEST_FILENAME} -f
  RewriteCond %{THE_REQUEST} (.*)\.php  
  RewriteRule ^(.*)\.php $1.html [R=301,L]  

  RewriteCond %{THE_REQUEST} (.*)\.html  
  RewriteRule ^(.*)\.html $1.php [L]  

  # All else goes to the controller page
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ mycontroller.php [L,QSA]
</IfModule>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM