كيف يمكنني استكشاف الأخطاء وإصلاحها لماذا لا يتم تطبيق قواعد إعادة الكتابة الخاصة بي بواسطة Apache؟
-
03-07-2019 - |
سؤال
لقد حصلت على تطبيق Tomcat 6 على الويب يعمل مع Apache HTTPD كأحد الأمامي. أنا أستخدم mod_proxy و mod_proxy_ajp لإعادة توجيه الطلبات إلى tomcat. خادمي يعمل Ubuntu. الآن أحاول استخدام mod_rewrite لإزالة WWW الرائدة ، بحيث يكون عنوان URL الخاص بي على الويب http://domain.com عوضا عن http://www.domain.com
لقد قرأت عددًا من البرامج التعليمية حول استخدام mod_rewrite ، لكن لا يمكنني الحصول على أي إعادة كتابة للعمل. لقد حاولت وضع قاعدة إعادة الكتابة في ملف .htaccess (بعد تعديل ملف/apache/apache/المواقع المتاحة/الافتراضي لضبط All). لقد حاولت وضع قاعدة إعادة الكتابة في Apache2.Conf و httpd.conf و rewrite.conf. لقد جربت كل هذه مع إعادة كتابة تسجيل الدخول. يتم إنشاء ملف السجل ، لكن أباتشي لم يكتب شيئًا له. اعتقدت أنه ربما كان mod_proxy يمنع بطريقة ما قواعد إعادة الكتابة من استخدامها ، لذلك حاولت تعطيل ذلك أيضًا ... وما زلت لا أحصل على إعادة كتابة ، ولا شيء للسجل.
في هذه المرحلة ، ليس لدي أي فكرة عما يجب تجربته بعد ذلك. كيف يمكنني إجراء استكشاف الأخطاء وإصلاحها لماذا لا يستخدم Apache قواعد إعادة الكتابة الخاصة بي؟
للإشارة ، إليك توجيهاتي لإعادة الكتابة:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
</IfModule>
يحرر: الإجابات أدناه مفيدة لحالتي الخاصة ، ولكن ربما لا تكون مفيدة للمجتمع في الوقت الحالي مثل الإجابات حول كيفية استكشاف توجيهات Apache بشكل عام. على سبيل المثال ، هل هناك طريقة لتمكين التسجيل إلى النقطة التي يخبرني فيها التوجيهات التي يتم تطبيقها في أي أمر يأتي عند الطلب؟
تحرير 2: لقد حصلت على أشياء للعمل الآن. لم يتم إعداد مضيفي الظاهري بشكل صحيح ، ولم يكن لدي أيضًا إعادة كتابة REGEX بشكل صحيح. إليكم توجيهات إعادة كتابة النهائي التي حصلت عليها:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
المحلول
محاولة الإجابة على سؤالك: لتصحيح عملية Apache يمكنك ضبط تسجيل مستوى إلى مستوى أقل (ربما debug
). ولكن حتى لو وضعت debug
إذا قمت بتعطيل السجل للوحدة المعنية ، فلن تحصل على أي رسائل منه. على سبيل المثال ، الافتراضي [RequestLogLevel][2]
هو 0 ، على سبيل المثال ، الوحدة النمطية لا تكتب أي رسائل. أراك قمت بتعيينه إلى 3 ولكن مثل روبورج قال تغييره إلى 9
ربما يكون هذا منخفضًا جدًا بالنسبة لحالتك.
تحاول أن تتفوق على مشكلتك: حاول تغيير طريقة إعادة كتابة اسم المضيف باستخدام النموذج العكسي - انظر إذا كان اسم المضيف هو ما تريده ، وإذا لم يكن الأمر كذلك ، قم بتغييره إلى اسم المضيف الذي تريده. كما ذكر في دليل إعادة كتابة عنوان URL - خادم Apache HTTP في موقع Apache:
أسماء المضيف الكنسي
وصف: الهدف من هذه القاعدة هو إجبار استخدام اسم مضيف معين ، لتفضيل أسماء المضيف الأخرى التي يمكن استخدامها للوصول إلى نفس الموقع. على سبيل المثال ، إذا كنت ترغب في فرض استخدام www.example.com بدلاً من example.com ، فيمكنك استخدام متغير من الوصفة التالية. المحلول:
# To force the use of RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://www.example.com/$1 [L,R]
في مثالهم ، يتغيرون من example.com
إلى www.example.com
لكنك حصلت على الفكرة. فقط اضبطه لحالتك.
نصائح أخرى
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]
</IfModule>
كان لديه نفس المشكلة مع الخادم الخاص بي ، لكن هذا نجح
حاول زيادة مستوى التسجيل حتى 9 (الحد الأقصى).
تأكد من أن Apache لديه الحقوق المناسبة في ملف السجل (على الرغم من أنه إذا قام بإنشائه ، فمن المحتمل أن يكتب إليه أيضًا).
جرب قاعدة إعادة كتابة مختلفة ، بدون شرط ، على سبيل المثال RewriteRule .* www.google.com [RL]
في أي سياق يتم وضع هذه القواعد؟ قد تضعها تحت مضيف افتراضي مختلف ، على سبيل المثال. حاول وضعها خارج أي حاوية إذا كان لديك مجال واحد فقط للاختبار.
على أي حال ، هناك بديل لتحقيق "لا www" ، ويتكون في استخدام مضيفين افتراضيين ، أحدهما لشركة WWW والآخر لـ "no-www". www واحد يعيد توجيه إلى الآخر:
<VirtualHost *:80>
ServerName www.domain.com
Redirect permanent / http://domain.com
</VirtualHost>
<VirtualHost *:80>
ServerName domain.com
#The rest of the configuration (proxying, etc.)
</VirtualHost>