mod_rewrite .htaccess вызывает 500 ошибок сервера, если URl не существует

Я только начал использовать mod_rewrite, это то, что я использую для довольно базового структурированного веб-сайта с поддержкой нескольких языков:

RewriteEngine on ErrorDocument 404 /error404.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z]{2})/$ index.php?lang=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z]{2})$ index.php?lang=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)$ $1.php [L] 

Моя идея заключалась в том, что языки указываются в начале URl и должны быть двух символов (az или AZ). После этого будет строка, которая ссылается на php-файл, который имеет то же имя файла, что и строка, а именно .php. Язык будет добавлен как GET-Variable ( ?lang=en ).

Таким образом, URl может выглядеть так: /en/index и затем перенаправляться на index.php?lang=en .

Если URl не начинается с языка, но напрямую со строкой, то никакая GET-переменная не будет привязана к строке. Например, /index должен ссылаться на index.php . Если строки нет, то индекс должен использоваться по умолчанию.

Все идет нормально. Работает отлично. Просто, если я ввожу строку (независимо от того, использую ли я 2 символа для языка или нет), на сайте всегда отображается 500 Internal Server Error, вместо перехода на error404.php . Кроме того, если я удалю эту строку (404) в .htaccess, она по-прежнему остается той же ошибкой.

Итак, я предполагаю, что что-то не так с другими строками в .htaccess, которые вызывают эту ошибку, кто-нибудь может понять, что это может быть?

Любая помощь высоко ценится!

Related of "mod_rewrite .htaccess вызывает 500 ошибок сервера, если URl не существует"

Ваши правила зацикливаются. С первого взгляда он выглядит как ваш последний:

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

Скажем, у меня есть этот URL, http://your.domain.com/blah , а файл blah.php не существует. Это то, что происходит.

  1. URI = blah ,! -f – это правда, это не файл
  2. URI = blah ,! -d – это правда, это не каталог
  3. URI = blah , внутреннее переписывание blah.php
  4. blah ! = blah.php , переписать цикл правил
  5. URI = blah.php ! -f – это правда, это не файл
  6. URI = blah.php ! -d – это правда, это не каталог
  7. URI = blah.php , внутренняя переписывать blah.php.php
  8. blah.php ! = blah.php.php , переписать цикл правил

Это продолжается до тех пор, пока механизм перезаписи не будет достаточным и не вернет ошибку сервера 500.

Вы можете сделать одну из двух вещей здесь:

  1. Добавьте директиву, чтобы вся остановка цикла была неважно , что легко обойти этот вид вещей. Но он нарушит правила, требующие цикла. Я не вижу ничего подобного в ваших правилах, поэтому это безопасно (по крайней мере пока) для этого. Просто добавьте это в начало своих правил:

     RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule ^ - [L] 
  2. Сделайте предварительную проверку, чтобы увидеть, действительно ли php-файл существует:

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

Хельмут, попробуйте это (последнее правило является причиной 500 внутренних ошибок, и это также включает предложение @DaveRandom для объединения правил 2 и 3):

 RewriteEngine on ErrorDocument 404 /error404.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z]{2})/?$ index.php?lang=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z0-9]+)$ $1.php [L]