كيف يمكنني تنفيذ RewriteCond/RewriteRule عالمي في Apache والذي ينطبق على جميع المضيفين الظاهريين؟

StackOverflow https://stackoverflow.com/questions/344588

  •  19-08-2019
  •  | 
  •  

سؤال

العنوان إلى حد كبير يقول كل شيء.:-) لدي الكثير من المضيفين الظاهريين وأريد وضع كتلة إعادة كتابة واحدة في الجزء العلوي من ملف httpd.conf الذي يعيد كتابة عناوين URL بغض النظر عن المضيف الظاهري الذي قد يتم توجيه الطلب إليه.كيف بحق الجحيم أفعل هذا؟

وجدت هذا لكن سؤالي هو نفسه:كيف يمكنني القيام بذلك دون اللجوء إلى ملفات .htaccess وتنفيذ بعض الإجراءات الأخرى لكل مضيف افتراضي؟

يا إلهي!

هل كانت مفيدة؟

المحلول

تحديد RewriteOptions InheritDown في النطاق الأصلي (مثل httpd.conf) لتطبيق القواعد الخاصة بك في المضيفين الظاهريين الفرعيين دون تعديلها.

سيعمل هذا فقط على المضيفين الظاهريين حيث RewriteEngine تم تعيين التوجيه على on:

لاحظ أن تكوينات إعادة الكتابة لا يتم توريثها بواسطة المضيفين الظاهريين.هذا يعني أنك تحتاج إلى RewriteEngine في التوجيه لكل مضيف افتراضي ترغب في استخدام قواعد إعادة الكتابة فيه.

(مصدر)

يدعم Apache هذا منذ الإصدار 2.4.8 (غير متوفر في وقت طرح السؤال الأصلي).

من الوثائق ل RewriteOptions:

يرث داون

إذا تم تمكين هذا الخيار، فسترث كافة التكوينات التابعة تكوين التكوين الحالي.إنه يعادل تحديد RewriteOptions Inherit في كافة التكوينات الفرعية.راجع خيار الوراثة لمزيد من التفاصيل حول كيفية التعامل مع العلاقات بين الوالدين والطفل.متوفر في Apache HTTP Server 2.4.8 والإصدارات الأحدث.

يرث من قبل

مثل InheritDown أعلاه، ولكن يتم تطبيق القواعد من النطاق الحالي قبل القواعد المحددة في نطاق أي طفل.متوفر في Apache HTTP Server 2.4.8 والإصدارات الأحدث.

تجاهل الميراث

يفرض هذا الخيار على التكوينات الحالية والتابعة تجاهل كافة القواعد التي سيتم توريثها من أحد الوالدين الذي يحدد InheritDown أو InheritDownBefore.متوفر في Apache HTTP Server 2.4.8 والإصدارات الأحدث.

(http://httpd.Apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions)

نصائح أخرى

وافتراضيا، لا يتم رثت إعدادات التكوين mod_rewrite ومن سياق الخادم الرئيسي من قبل المضيفين الظاهري. لجعل الخادم الرئيسي تطبيق الإعدادات المضيفين الظاهري، يجب عليك وضع التوجيهات التالية في كل قسم <VirtualHost>:

RewriteEngine On
RewriteOptions Inherit 

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html لالعثور على مزيد من المعلومات

ويبدو أن أبسط الحلول الممكنة هو إضافة

RewriteOptions inherit

وعلى كل التوجيه VirtualHost. هذا هو أبسط كثيرا على الأقل من العبث مع الملفات هتكس. أباتشي واضح جدا على حقيقة أن

<اقتباس فقرة>   

وافتراضيا، كتابة تكوينات هي   غير موروث. هذا يعني أنك   تحتاج إلى أن يكون RewriteEngine على   التوجيه لكل المضيف الظاهري في   التي ترغب في استخدامها.   ( http://httpd.apache.org/docs/1.3/mod/mod_rewrite. أتش تي أم أل )

وعلى ما يبدو وسيلة لتغيير الافتراضي عبر RewriteOptions في الطفل (عشقتك أو المدير)، لذلك ما عليك القيام به <م> شيء في كل طفل.

وأنا لم نجرب ذلك، لذلك قد لا تعمل، ولكن أود أن حاول إضافة توجيه include في جميع الكتل المضيف الظاهري لملف واحد. سيكون لديك لتغيير كل كتلة تكوين المضيف الظاهري مرة واحدة، ولكن بعد ذلك، يجب أن يكون مكانا مركزيا يمكن من خلالها إجراء تغييرات. YMMV.

إذا كنت تحاول فقط لكتابة شيء ما في جزء المجال من اسم، على سبيل المثال لإصلاح الأخطاء الإملائية الشائعة، حتى أنك لا تحتاج الخيار "وراثة". الإعداد لي المضيف الظاهري لا اسم للقبض على جميع أسماء المضيفين غير صالحة وrespell بشكل صحيح قبل إعادة توجيهها.

ومنذ هذا يستخدم الموجهات، سيتم العثور على المضيف الظاهري المناسب بعد أن تم تطبيق يعيد كتابة.

Options +Indexes +FollowSymLinks
RewriteEngine on
# If it begins with only domain.com, prepend www and send to www.domain.com
RewriteCond %{HTTP_HOST} ^domain [NC]
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301]

# Correct misspelling in the domain name, applies to any VirtualHost in the domain
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301]

# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them
<VirtualHost *>
    RewriteEngine on
    RewriteOptions inherit
</VirtualHost>

ولقد استعملت دائما عشقتك "اللحاق جميع" لتوجيهات أردت في جميع المجالات، مثل ......

Listen 80
NameVirtualHost *:80

<VirtualHost *:80>
ErrorLog "/var/log/apache2/error_log"
</VirtualHost>

<VirtualHost *:80>
ServerName alloftherestoftheVHosts.com
DocumentRoot "/ServiceData/.........
............ 

وانها دائما <م> بدا للعمل ... وسجلات الخطأ الحصول على جنبا إلى جنب بشكل صحيح، وما إلى ذلك ...... ولكن من الممكن أن هذا كان نتيجة لفي وقت سابق / متضاربة / like- توجيه التفكير.

ملحوظة الشخصية .. <م> من كان يحلم مخطط التكوين أباتشي وكان جملة من الشخص السخيف، أو مجموعة من دينغ باتس، الذي قضى وقتا طويلا في كهفهم .... يجب طردها الامر كله وXMLized، أو شيء من هذا! على الرغم من أن كلاهما يختلف بعنف ... عملية الإعداد مرحبا كيتي-من شيروكي .. إلى إنجن إكس التكوين .... كلاهما أكثر من ذلك بكثير منطقي ..

وأنت قد تحتاج إلى استخدام InheritDownBefore لتجنب الاضطرار إلى إضافة المزيد من خردة إلى vhosts الخاص بك.

ومثال على الاسم المستعار letsencrypt العالمي:

# letsencrypt
<IfModule alias_module>
    Alias /.well-known/ /var/www/html/.well-known/
</IfModule>
<IfModule mod_rewrite.c>
    # prevent vhost rewrites from killing the alias
    RewriteEngine On
    RewriteOptions InheritDownBefore
    RewriteCond %{REQUEST_URI} ^/\.well\-known
    RewriteRule . - [L,PT]
</IfModule>

وبعد ذلك يمكنك أن تفعل ذلك في كل من vhosts الخاص بك، مع عدم وجود توجيهات أخرى:

<VirtualHost *:80>
    ....
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^/.*            /index.php [L,PT]
    </IfModule>
</VirtualHost>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top