1

stackoverflow のように、名前を URL として使用しようとしています。私はgodaddy Linuxホスティングを使用しており、mod_rewrite URLを制御するために.htaccessを使用しています。

私は次のものを取得しようとしています:

  • /about => about.php
  • /schools/add => add-school.php
  • /api/questions/ask => /questions.php?action=ask
  • /api/questions/158 => /questions.php?action=get&id=158
  • /api/questions/144/points => /questions.php?action=get-points&id=144

これは私がこれまでに持っているものであり、機能していません:

## Mod rewrite manual: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
<IfModule mod_rewrite.c>
  RewriteEngine On

  # try the corresponding php file
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ([A-Za-z0-9_-]+) $1.php [qsa]

  # special cases
  RewriteRule ^schools\/add$ add-school.php

  # API
  RewriteRule ^api\/questions\/ask$ "api.php?action=ask" [qsa]
  RewriteRule ^api\/questions\/(\d+)$ "api.php?action=get&id=$1" [qsa]
  RewriteRule ^api\/questions\/(\d+)\/points$ "api.php?action=get-points&id=$1" [qsa]

</IfModule>
4

2 に答える 2

1

あなたのコードにはいくつかの間違いがあります:

  1. 書き換えルールの順序は非常に重要です。常に、最も具体的なものから最も一般的なものの順に並べる必要があります。一般的なものは特定のルールのパターンに一致し、それらの特殊なケースをオーバーライドできることを覚えておいてください。
  2. 個々のルールの終わりには常にL(last) を付けます。
  3. リクエストを転送するに.phpは、php ファイルが実際に存在することを確認する必要があります。

これらの提案により、変更されたコードは次のとおりです。

Options +FollowSymLinks -MultiViews

<IfModule mod_rewrite.c>
  # Turn mod_rewrite on
  RewriteEngine On
  RewriteBase /

  # special cases
  RewriteRule ^schools/add/?$ /add-school.php [L,NC]

  # API
  RewriteRule ^api/questions/ask/?$ /api.php?action=ask [L,QSA,NC]
  RewriteRule ^api/questions/(d+)/points/?$ /api.php?action=get-points&id=$1 [L,QSA,NC]
  RewriteRule ^api/questions/(d+)/?$ /api.php?action=get&id=$1 [L,QSA,NC]

  # try the corresponding php file if it exists
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{DOCUMENT_ROOT}/$1.php -f
  RewriteRule ^(.+?)/?$ $1.php [L]
</IfModule>
于 2013-06-23T06:13:00.763 に答える
1

したがって、最初の RewriteRule が引き継ぎます。school/add に移動してファイルが存在しない場合は、schools.php にリダイレクトされますが、これも存在しないため、それらを並べ替える必要があり、その間にエスケープを削除します。

## Mod rewrite manual: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
<IfModule mod_rewrite.c>
  RewriteEngine On

  # special cases
  RewriteRule ^schools/add$ add-school.php

  # API
  RewriteRule ^api/questions/ask$ api.php?action=ask [qsa]
  RewriteRule ^api/questions/(d+)$ api.php?action=get&id=$1 [qsa]
  RewriteRule ^api/questions/(d+)/points$ api.php?action=get-points&id=$1 [qsa]


  # try the corresponding php file
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ([A-Za-z0-9_-]+) $1.php [qsa]
</IfModule>
于 2013-06-23T05:33:15.037 に答える