1

.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]
4

3 に答える 3

1

試す:

<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>
于 2012-09-13T16:34:29.527 に答える
0

これを試してください(パラメーター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]
于 2012-09-13T10:56:33.087 に答える
0

これを行うにはもっと良い方法があると確信していますが、以下は私のニーズに合っています。提供された他の答えは、私の試みにもかかわらずうまくいかなかったようです。

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>
于 2012-09-15T03:29:02.783 に答える