Я только начал использовать 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, которые вызывают эту ошибку, кто-нибудь может понять, что это может быть?
Любая помощь высоко ценится!
Ваши правила зацикливаются. С первого взгляда он выглядит как ваш последний:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)$ $1.php [L]
Скажем, у меня есть этот URL, http://your.domain.com/blah
, а файл blah.php
не существует. Это то, что происходит.
blah
,! -f – это правда, это не файл blah
,! -d – это правда, это не каталог blah
, внутреннее переписывание blah.php
blah
! = blah.php
, переписать цикл правил blah.php
! -f – это правда, это не файл blah.php
! -d – это правда, это не каталог blah.php
, внутренняя переписывать blah.php.php
blah.php
! = blah.php.php
, переписать цикл правил Это продолжается до тех пор, пока механизм перезаписи не будет достаточным и не вернет ошибку сервера 500.
Вы можете сделать одну из двух вещей здесь:
Добавьте директиву, чтобы вся остановка цикла была неважно , что легко обойти этот вид вещей. Но он нарушит правила, требующие цикла. Я не вижу ничего подобного в ваших правилах, поэтому это безопасно (по крайней мере пока) для этого. Просто добавьте это в начало своих правил:
RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule ^ - [L]
Сделайте предварительную проверку, чтобы увидеть, действительно ли 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]