0

modの書き換えに問題がある

URLをphpからhtmlに変換するhtaccessを作ってみた

そしてすべてがうまくいく

しかし問題は、form.phpのように変換する必要のないファイルです

これは私のhtaccessです

RewriteCond %{REQUEST_URI} !^(.*)form.php(.*)$
RewriteCond %{REQUEST_URI} !^(.*)sitemap\.xml(.*)$
RewriteCond %{THE_REQUEST} ^[A-Z]+\s([^/]+)\.php\s
RewriteRule .* %1.html [R=301,L]
RewriteRule ^([^/]*)\.html$ $1.php
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^.*$ - [L]
RewriteRule ^index.php$ http://%{http_host} [R=301,L]

sitemap.xml と form.php を変換する必要はありません

しかし、ファイルform.phpを見ようとするとエラーが発生しました

HTTP エラー 500 (内部サーバー エラー): サーバーが要求を実行しようとしたときに、予期しない状況が発生しました。

私は何ができますか?

4

1 に答える 1

0

マーク B が提案するように、ログを確認することから始めるのが最適です。次のように、より詳細な mod_rewrite ロギングを有効にする必要があります。

RewriteLog "/usr/local/var/apache/logs/rewrite.log"
RewriteLogLevel 3

RewriteLogLevel3 よりも高い詳細度を使用しないでください。

だから、あなたのルールを読んで、私はあなたが何を意味するかを知っていると思います. これを試してください:

RewriteCond %{REQUEST_URI} !form\.php$

Apache は、URL に続く可能性のあるクエリ文字列を気にしているとは思いません。%{QUERY_STRING}に加えて使用できる変数があります%{REQUEST_URI}。「php」が含まれている可能性のある奇妙な URL がない限り、それらはすべて「.php」で終わると思います。

"sitemap.xml" は問題ないように見えるので、その例に従ってピリオド文字 (".") を "\." と同じ方法でエスケープする必要がある可能性があります。

翌日、これらのルールについて考える時間がありました。

# Use simpler rules, not all that jazz you prepend, appended.
# 
RewriteCond %{REQUEST_URI} form\.php$ [OR]
RewriteCond %{REQUEST_URI} sitemap\.xml$ 
# If %{REQUEST_URI} matches either of the previous rule, 
# we skip a certain number of RewriteRules that follow. 
# If you add more rules, and need to skip more, you *need* to adjust this number.
RewriteRule . - [S=2]  

# Your original line reads:
#
# RewriteCond %{THE_REQUEST} ^[A-Z]+\s([^/]+)\.php\s
#
# Using "%{THE_REQUEST}" variable means you are processing
# a string like this
#
# "GET /something.html HTTP/1.1"
#
# Did you really need the HTTP method and the protocol version?
# Do something simpler. Match the the "http://host/foo/bar/baz/" portion
# Then match the first part of the PHP file name. So, if URL ends in "something.php"
# The second parenthesis will match "something". Then append ".html" 

RewriteRule (^.*\/)([^/]+)(\.php)$   $1$2.html [R=301,L]

# **Then** you are trying to rewrite your HTML files to PHP? Why?
# In any case, do something similar as the last RewriteRule. 

RewriteRule (^.*\/)([^/]+)(\.html)$   $1$2.php [R=301,L]

# I do not understand RewriteCond %{ENV:REDIRECT_STATUS} 200 at all
# I don't see you using this environmental variable later on in this
# snippet. Recommend the use of "PT" in case you have other stuff running
# that you want to send the rewrite target to be passed back to the 
# URL mapping engine. 

RewriteRule ^.*$ - [PT, QSA]

# You neglected to add the leading slash in this pattern
RewriteRule ^/index.php$ http://%{http_host} [R=301,L]
于 2012-09-16T04:01:40.583 に答える